/* This file is autogenerated by jig 0.3.0 from file ENode.jsi
 *
 * DO NOT EDIT THIS FILE */

#include <njs/jig.h>
#include "js-ENode.h"

/* This interface complies with the following standard:
 * ENode IDL (docs/ENode.idl) */

#line 11 "ENode.jsi"


/*
 * Javascript binding for Entity
 * Copyright (c) 2000 Brian Bassett and Ian Main
 *
 * Authors: Brian Bassett <bbassett@bbassett.net>
 *	    Ian Main <imain@gtk.org>
 */

/*
 * This renderer is free software; please see the LICENSE file for
 * specific information as to licensing conditions.
 */

/*
 * $Source: /home/cvs/entity/renderers/javascript/js-ENode.c,v $
 * $Id: js-ENode.c,v 1.39 2000/12/10 00:29:15 imain Exp $
 */

#line 32 "js-ENode.c"

#line 32 "ENode.jsi"



void
js_return_enode (JSVirtualMachine *js_vm, JSBuiltinInfo *js_info, 
		 JSNode *retval, ENode *node)
{
    ENodeInstanceCtx *ni;

    ni = js_calloc(js_vm, 1, sizeof(*ni));
    ni->enode = node;
    enode_ref (node);

    js_vm_builtin_create(js_vm, retval, js_info, ni);

    /* If all we ever do is call enode(), the vm will never
     * do gc otherwise.. */

    /*
    if (js_vm->gc.bytes_allocated >= js_vm->gc.trigger) {
	js_vm_garbage_collect (js_vm, retval, retval);
    }
    */
}

static void
js_return_enode_array (JSVirtualMachine *js_vm, JSNode *js_retval,
		       JSBuiltinInfo *js_info, GSList *list)
{
    ENodeInstanceCtx *ni;
    gint i = 0;
    GSList *tmp = list;
    gint len = g_slist_length (tmp);
    
    js_vm_make_array (js_vm, js_retval, len);
    
    while (tmp) {
	ENode *enode = tmp->data;
    	ni = js_calloc(js_vm, 1, sizeof(*ni));
	ni->enode = enode;
	enode_ref (enode);

	js_vm_builtin_create(js_vm, &js_retval->u.varray->data[i], 
			     js_info, ni);
	i++;
	tmp = tmp->next;
    }
}

static void
js_return_ebuf_array (JSVirtualMachine *js_vm, JSNode *js_retval,
		      GSList *list)
{
    gint i = 0;
    GSList *tmp = list;
    gint len = g_slist_length (tmp);
   
    EDEBUG (("javascript", "Creating ebuf array of length %d\n", len));
    js_vm_make_array (js_vm, js_retval, len);
    
    while (tmp) {
	EBufConst *buf = tmp->data;

	js_retval->u.varray->data[i].type = JS_STRING;
	js_vm_make_string (js_vm, &js_retval->u.varray->data[i], 
	    buf->str, buf->len);
	i++;
	tmp = tmp->next;
    }
}

static void
js_return_string_array (JSVirtualMachine *js_vm, JSNode *js_retval,
	  	        GSList *list)
{
    gint i = 0;
    GSList *tmp = list;
    gint len = g_slist_length (tmp);
    
    EDEBUG (("javascript", "Creating string array of length %d\n", len));
    js_vm_make_array (js_vm, js_retval, len);
    
    while (tmp) {
	gchar *str = tmp->data;

	js_retval->u.varray->data[i].type = JS_STRING;
	js_vm_make_string (js_vm, &js_retval->u.varray->data[i], 
			   str, strlen (str));
	i++;
	tmp = tmp->next;
    }
}




#line 131 "js-ENode.c"

static int ENode_method(JSVirtualMachine *js_vm, JSBuiltinInfo *js_info, void *js_ictx, JSSymbol js_method, JSNode *js_retval, JSNode *js_args) {
  ENodeCtx *js_context = js_info->obj_context;
  ENodeInstanceCtx *js_instance = (ENodeInstanceCtx *)js_ictx;

  if(js_ictx == NULL) {
  
    return JS_PROPERTY_UNKNOWN;

  return JS_PROPERTY_FOUND;
  }

  if(js_method == js_context->s_new_child) {
#undef js_return
#define js_return js_return_object

  char *basename = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "new_child(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  basename = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 145 "ENode.jsi"

	
	    ENode *node = js_instance->enode;
	    ENode *new_child;

	    new_child = enode_new_child (node, basename, NULL);
	    
	    js_return_enode (js_vm, js_info, js_retval, new_child);
    
#line 167 "js-ENode.c"
    } while(0);
  js_free(basename);
  } else if(js_method == js_context->s_parent) {
#undef js_return
#define js_return js_return_object

  char *search = NULL;
  unsigned int search_valid = (js_args->u.vinteger >= 1);
  JSNode js_tempnode;
  if (js_args->u.vinteger > 1 || js_args->u.vinteger < 0) {
    js_vm_set_err(js_vm, "parent(): illegal number of arguments");    js_vm_error(js_vm);
  }
  if (search_valid) {
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  search = js_string_to_c_string(js_vm, &js_tempnode);
  }
    do {
#line 269 "ENode.jsi"

	
	ENode *node;
	ENode *parent;

	node = js_instance->enode; 
	parent = enode_parent (node, search);	

	if (parent) {
	    js_return_enode (js_vm, js_info, js_retval, parent);
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 201 "js-ENode.c"
    } while(0);
  js_free(search);
  } else if(js_method == js_context->s_child) {
#undef js_return
#define js_return js_return_object

  char *search = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "child(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  search = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 285 "ENode.jsi"


	ENode *node;
	ENode *child;

	node = js_instance->enode; 
	child = enode_child (node, search);	

	if (child) {
	    js_return_enode (js_vm, js_info, js_retval, child);
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 232 "js-ENode.c"
    } while(0);
  js_free(search);
  } else if(js_method == js_context->s_child_rx) {
#undef js_return
#define js_return js_return_object

  char *regex = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "child_rx(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  regex = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 300 "ENode.jsi"


	ENode *node;
	ENode *child;

	node = js_instance->enode; 
	child = enode_child_rx (node, regex);	

	if (child) {
	    js_return_enode (js_vm, js_info, js_retval, child);
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 263 "js-ENode.c"
    } while(0);
  js_free(regex);
  } else if(js_method == js_context->s_children) {
#undef js_return
#define js_return js_return_array

  char *search = NULL;
  unsigned int search_valid = (js_args->u.vinteger >= 1);
  JSNode js_tempnode;
  if (js_args->u.vinteger > 1 || js_args->u.vinteger < 0) {
    js_vm_set_err(js_vm, "children(): illegal number of arguments");    js_vm_error(js_vm);
  }
  if (search_valid) {
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  search = js_string_to_c_string(js_vm, &js_tempnode);
  }
    do {
#line 315 "ENode.jsi"


	ENode *node;
	GSList *children;

	node = js_instance->enode; 
	children = enode_children (node, search);	

	if (children) {
	    js_return_enode_array (js_vm, js_retval,
				   js_info, children);
	    g_slist_free (children);
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 299 "js-ENode.c"
    } while(0);
  js_free(search);
  } else if(js_method == js_context->s_children_rx) {
#undef js_return
#define js_return js_return_array

  char *regex = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "children_rx(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  regex = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 332 "ENode.jsi"

	ENode *node;
	GSList *children;

	node = js_instance->enode; 
	children = enode_children_rx (node, regex);	

	if (children) {
	    js_return_enode_array (js_vm, js_retval,
				   js_info, children);
	    g_slist_free (children);
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 331 "js-ENode.c"
    } while(0);
  js_free(regex);
  } else if(js_method == js_context->s_children_attrib) {
#undef js_return
#define js_return js_return_array

  char *attrib = NULL;
  char *attrval = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 2) {
    js_vm_set_err(js_vm, "children_attrib(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  attrib = js_string_to_c_string(js_vm, &js_tempnode);
  js_vm_to_string(js_vm, &js_args[2], &js_tempnode);
  attrval = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 348 "ENode.jsi"

	ENode *node;
	GSList *children;
	EBufFreeMe *eval;

	node = js_instance->enode; 
	eval = ebuf_new_with_str (attrval);
	children = enode_children_attrib (node, attrib, eval);	
	ebuf_free (eval);

	if (children) {
	    js_return_enode_array (js_vm, js_retval,
				   js_info, children);
	    g_slist_free (children);
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 369 "js-ENode.c"
    } while(0);
  js_free(attrib);
  js_free(attrval);
  } else if(js_method == js_context->s_children_attrib_rx) {
#undef js_return
#define js_return js_return_array

  char *attrib = NULL;
  char *regex = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 2) {
    js_vm_set_err(js_vm, "children_attrib_rx(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  attrib = js_string_to_c_string(js_vm, &js_tempnode);
  js_vm_to_string(js_vm, &js_args[2], &js_tempnode);
  regex = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 367 "ENode.jsi"

	ENode *node;
	GSList *children;

	node = js_instance->enode; 
	children = enode_children_attrib_rx (node, attrib, regex);	

	if (children) {
	    js_return_enode_array (js_vm, js_retval,
				   js_info, children);
	    g_slist_free (children);
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 405 "js-ENode.c"
    } while(0);
  js_free(attrib);
  js_free(regex);
  } else if(js_method == js_context->s_call) {
#undef js_return
#define js_return js_return_cstring

  char *function = NULL;
  long js_varargc = (js_args->u.vinteger - 1);
  JSNode *js_varargv = &js_args[2];
  JSNode js_tempnode;
  if (js_args->u.vinteger < 1) {
    js_vm_set_err(js_vm, "call(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  function = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 384 "ENode.jsi"

      
	EBufFreeMe *valret;
	GSList *call_args = NULL;
	char *fmt = NULL;

	if (js_varargc > 1) {
	    js_vm_to_string (js_vm, &js_varargv[0], &js_tempnode);
	    fmt = js_string_to_c_string (js_vm, &js_tempnode);
	    /* Advance start of varargs to next entry */
	    js_varargv = &js_varargv[1];
	    js_varargc--;
	}
	
	if (fmt) {
	    int i;
	    int n_args = strlen (fmt);

	    EDEBUG(("js-embed", "node.call: got the function name %s, argstring '%s'", 
	    	    function, fmt));

	    if (n_args != js_varargc) {
		js_vm_set_err (js_vm, "call(): argument list does not match argument count");
		js_vm_error (js_vm);
	    }
	    
	    /* We start at 1 because the fmt argument is the first real vararg */
	    for (i = 0; i < js_varargc; i++) {
		JSNode js_tempnode;
		char *str;
		int vint;

		switch(fmt[i]) {
		   
		    case 'n': 
    			EDEBUG(("js-embed", "call(): processing got an enode"));
			
			if (js_varargv[i].type == JS_BUILTIN) {
			    ENodeInstanceCtx *ni;
			    ni = js_varargv[i].u.vbuiltin->instance_context;
			    if (ni)
				call_args = enode_call_push_node(call_args, ni->enode);
			} else {
			    js_vm_set_err (js_vm, 
				"call(): argument does not match format (node not an Object)");
			    js_vm_error (js_vm);
			}
			break;

  		    /* We're just gonna make strings for all of these for now */
		    case 'e':
		    case 'b':
			js_vm_to_string (js_vm, &js_varargv[i], &js_tempnode);
			call_args = enode_call_push_data (call_args, 
							  js_tempnode.u.vstring->data, 
							  js_tempnode.u.vstring->len);
			break;	

		    case 's':
			
			js_vm_to_string (js_vm, &js_varargv[i], &js_tempnode);
			str = js_string_to_c_string (js_vm, &js_tempnode);
			call_args = enode_call_push_str (call_args, str);
			EDEBUG(("js-embed", "call(): vararg %d: string '%s'",
				i, str));
			break;	
			
		    case 'i':
			
			js_vm_to_number (js_vm, &js_varargv[i], &js_tempnode);
			vint = js_tempnode.u.vinteger;	
			call_args = enode_call_push_int (call_args, vint);
			EDEBUG(("js-embed", "call(): vararg %d: int '%d'",
				i, vint));
			break;
			
		    default:
			/* bad args string */
			enode_call_free_arg_list_items (call_args);
			js_vm_set_err (js_vm, "call(): Bad argument character '%s'", fmt[i]);
			js_vm_error (js_vm);
		}
	    }
	}
	
	valret = enode_call_with_list (js_instance->enode, function, call_args);
	
	if (!valret) {
	    EDEBUG(("js-embed", "call(): retval was NULL. returning none"));
	    js_retval->type = JS_NULL;
	} else {
    	    js_retval->type = JS_STRING;
    	    js_vm_make_string (js_vm, js_retval, valret->str, valret->len);
    	    ebuf_free(valret);
	}

    
#line 522 "js-ENode.c"
    } while(0);
  js_free(function);
  } else if(js_method == js_context->s_attrib_quiet) {
#undef js_return
#define js_return js_return_cstring

  char *attrib = NULL;
  char *value = NULL;
  unsigned int value_valid = (js_args->u.vinteger >= 2);
  JSNode js_tempnode;
  if (js_args->u.vinteger > 2 || js_args->u.vinteger < 1) {
    js_vm_set_err(js_vm, "attrib_quiet(): illegal number of arguments");    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  attrib = js_string_to_c_string(js_vm, &js_tempnode);
  if (value_valid) {
  js_vm_to_string(js_vm, &js_args[2], &js_tempnode);
  value = js_string_to_c_string(js_vm, &js_tempnode);
  }
    do {
#line 482 "ENode.jsi"


	ENode *node;
	EBufConst *valret;
	EBuf *val = NULL;
	
	node = js_instance->enode;
	if (value)
	    val = ebuf_new_with_str (value);

	valret = enode_attrib_quiet (node, attrib, val);	
	
	if (valret) {
    	    js_retval->type = JS_STRING;
	    js_vm_make_string (js_vm, js_retval, valret->str, valret->len);
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 564 "js-ENode.c"
    } while(0);
  js_free(attrib);
  js_free(value);
  } else if(js_method == js_context->s_attrib_is_true) {
#undef js_return
#define js_return js_return_boolean

  char *attrib = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "attrib_is_true(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  attrib = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 502 "ENode.jsi"

	js_retval->type= JS_BOOLEAN;
	js_retval->u.vboolean = enode_attrib_is_true (js_instance->enode, attrib);	
    
#line 586 "js-ENode.c"
    } while(0);
  js_free(attrib);
  } else if(js_method == js_context->s_list_set_attribs) {
#undef js_return
#define js_return js_return_array

  if (js_args->u.vinteger != 0) {
    js_vm_set_err(js_vm, "list_set_attribs(): illegal number of arguments");
    js_vm_error(js_vm);
  }
    do {
#line 507 "ENode.jsi"

	GSList *lst;
   
	lst = enode_list_set_attribs (js_instance->enode); 

	if (lst) {
	    js_return_ebuf_array (js_vm, js_retval, lst);
	    g_slist_free (lst);
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 612 "js-ENode.c"
    } while(0);
  } else if(js_method == js_context->s_supported_attribs) {
#undef js_return
#define js_return js_return_array

  if (js_args->u.vinteger != 0) {
    js_vm_set_err(js_vm, "supported_attribs(): illegal number of arguments");
    js_vm_error(js_vm);
  }
    do {
#line 520 "ENode.jsi"

	
	GSList *lst;
   
	lst = enode_supported_attribs (js_instance->enode); 
	
	if (lst) {
	    js_return_string_array (js_vm, js_retval, lst);
	    g_slist_free (lst);
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 638 "js-ENode.c"
    } while(0);
  } else if(js_method == js_context->s_attrib_description) {
#undef js_return
#define js_return js_return_cstring

  char *attrib = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "attrib_description(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  attrib = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 534 "ENode.jsi"

	gchar *ret;
	ret = enode_attrib_description (js_instance->enode, attrib);
	if (ret) {
    	    js_retval->type = JS_STRING;
	    js_vm_make_string (js_vm, js_retval, ret, strlen (ret));
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 664 "js-ENode.c"
    } while(0);
  js_free(attrib);
  } else if(js_method == js_context->s_attrib_value_type) {
#undef js_return
#define js_return js_return_cstring

  char *attrib = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "attrib_value_type(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  attrib = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 545 "ENode.jsi"

	gchar *ret;
	ret = enode_attrib_value_type (js_instance->enode, attrib);
	if (ret) {
    	    js_retval->type = JS_STRING;
	    js_vm_make_string (js_vm, js_retval, ret, strlen (ret));
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 691 "js-ENode.c"
    } while(0);
  js_free(attrib);
  } else if(js_method == js_context->s_attrib_possible_values) {
#undef js_return
#define js_return js_return_cstring

  char *attrib = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "attrib_possible_values(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  attrib = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 556 "ENode.jsi"

	gchar *ret;
	ret = enode_attrib_possible_values (js_instance->enode, attrib);
	if (ret) {
    	    js_retval->type = JS_STRING;
	    js_vm_make_string (js_vm, js_retval, ret, strlen (ret));
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 718 "js-ENode.c"
    } while(0);
  js_free(attrib);
  } else if(js_method == js_context->s_attribs_sync) {
#undef js_return
#define js_return js_return_undef

  if (js_args->u.vinteger != 0) {
    js_vm_set_err(js_vm, "attribs_sync(): illegal number of arguments");
    js_vm_error(js_vm);
  }
    do {
#line 567 "ENode.jsi"

	enode_attribs_sync (js_instance->enode);
    
#line 735 "js-ENode.c"
    } while(0);
  } else if(js_method == js_context->s_destroy) {
#undef js_return
#define js_return js_return_undef

  if (js_args->u.vinteger != 0) {
    js_vm_set_err(js_vm, "destroy(): illegal number of arguments");
    js_vm_error(js_vm);
  }
    do {
#line 571 "ENode.jsi"

	enode_destroy (js_instance->enode);
    
#line 751 "js-ENode.c"
    } while(0);
  } else if(js_method == js_context->s_destroy_children) {
#undef js_return
#define js_return js_return_undef

  if (js_args->u.vinteger != 0) {
    js_vm_set_err(js_vm, "destroy_children(): illegal number of arguments");
    js_vm_error(js_vm);
  }
    do {
#line 582 "ENode.jsi"


	ENode *node;

	node = js_instance->enode; 
	enode_destroy_children (node);	
    
#line 771 "js-ENode.c"
    } while(0);
  } else if(js_method == js_context->s_get_xml) {
#undef js_return
#define js_return js_return_cstring

  if (js_args->u.vinteger != 0) {
    js_vm_set_err(js_vm, "get_xml(): illegal number of arguments");
    js_vm_error(js_vm);
  }
    do {
#line 592 "ENode.jsi"

	ENode *node;
	EBufFreeMe *xml;

	node = js_instance->enode; 
	xml = enode_get_xml (node);	
	if (xml) {
	    js_retval->type = JS_STRING;
	    js_vm_make_string (js_vm, js_retval, xml->str, xml->len);
	}
    
#line 795 "js-ENode.c"
    } while(0);
  } else if(js_method == js_context->s_get_child_xml) {
#undef js_return
#define js_return js_return_cstring

  if (js_args->u.vinteger != 0) {
    js_vm_set_err(js_vm, "get_child_xml(): illegal number of arguments");
    js_vm_error(js_vm);
  }
    do {
#line 604 "ENode.jsi"

	ENode *node;
	EBufFreeMe *xml;

	node = js_instance->enode; 
	xml = enode_get_child_xml (node);	
	if (xml) {
	    js_retval->type = JS_STRING;
	    js_vm_make_string (js_vm, js_retval, xml->str, xml->len);
	    ebuf_free (xml);
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 822 "js-ENode.c"
    } while(0);
  } else if(js_method == js_context->s_append_xml) {
#undef js_return
#define js_return js_return_undef

  char *xml = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "append_xml(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  xml = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 619 "ENode.jsi"

	ENode *node;
	EBuf *xmlbuf;
	node = js_instance->enode; 

	xmlbuf = ebuf_new_with_str (xml);
	enode_append_xml (node, xmlbuf);
	ebuf_free (xmlbuf);
    
#line 847 "js-ENode.c"
    } while(0);
  js_free(xml);
  } else if(js_method == js_context->s_set_data) {
#undef js_return
#define js_return js_return_undef

  char *data = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "set_data(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  data = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 629 "ENode.jsi"

	EBufFreeMe *databuf;
	databuf = ebuf_new_with_data (js_tempnode.u.vstring->data,
				      js_tempnode.u.vstring->len);
	enode_set_data (js_instance->enode, databuf);
	ebuf_free (databuf);
    
#line 871 "js-ENode.c"
    } while(0);
  js_free(data);
  } else if(js_method == js_context->s_get_data) {
#undef js_return
#define js_return js_return_cstring

  if (js_args->u.vinteger != 0) {
    js_vm_set_err(js_vm, "get_data(): illegal number of arguments");
    js_vm_error(js_vm);
  }
    do {
#line 637 "ENode.jsi"

	EBufConst *data;

	data = enode_get_data (js_instance->enode);	
	if (data) {
	    js_retval->type = JS_STRING;
	    js_vm_make_string (js_vm, js_retval, data->str, data->len);
	} else {
	    js_retval->type = JS_NULL;
	}
    
#line 896 "js-ENode.c"
    } while(0);
  } else if(js_method == js_context->s_append_data) {
#undef js_return
#define js_return js_return_undef

  char *data = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "append_data(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  data = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 649 "ENode.jsi"

	EBufFreeMe *databuf;

	databuf = ebuf_new_with_data (js_tempnode.u.vstring->data,
				      js_tempnode.u.vstring->len);
	enode_append_data (js_instance->enode, databuf);
	ebuf_free (databuf);
    
#line 920 "js-ENode.c"
    } while(0);
  js_free(data);
  } else if(js_method == js_context->s_insert_data) {
#undef js_return
#define js_return js_return_undef

  long offset = 0;
  char *data = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 2) {
    js_vm_set_err(js_vm, "insert_data(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_number(js_vm, &js_args[1], &js_tempnode);
  if(js_tempnode.type == JS_INTEGER) {
    offset = js_tempnode.u.vinteger;
  } else {
    js_vm_set_err(js_vm, "insert_data(): illegal argument (offset not an integer)");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[2], &js_tempnode);
  data = js_string_to_c_string(js_vm, &js_tempnode);
    do {
#line 658 "ENode.jsi"

	EBufFreeMe *databuf;

	databuf = ebuf_new_with_data (js_tempnode.u.vstring->data,
				      js_tempnode.u.vstring->len);
	enode_insert_data (js_instance->enode, offset, databuf);
	ebuf_free (databuf);
    
#line 953 "js-ENode.c"
    } while(0);
  js_free(data);
  } else if(js_method == js_context->s_delete_data) {
#undef js_return
#define js_return js_return_undef

  long offset = 0;
  long count = 0;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 2) {
    js_vm_set_err(js_vm, "delete_data(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_number(js_vm, &js_args[1], &js_tempnode);
  if(js_tempnode.type == JS_INTEGER) {
    offset = js_tempnode.u.vinteger;
  } else {
    js_vm_set_err(js_vm, "delete_data(): illegal argument (offset not an integer)");
    js_vm_error(js_vm);
  }
  js_vm_to_number(js_vm, &js_args[2], &js_tempnode);
  if(js_tempnode.type == JS_INTEGER) {
    count = js_tempnode.u.vinteger;
  } else {
    js_vm_set_err(js_vm, "delete_data(): illegal argument (count not an integer)");
    js_vm_error(js_vm);
  }
    do {
#line 667 "ENode.jsi"

	enode_delete_data (js_instance->enode, offset, count);
    
#line 986 "js-ENode.c"
    } while(0);
  } else 
    return JS_PROPERTY_UNKNOWN;

  return JS_PROPERTY_FOUND;
}

static int ENode_property(JSVirtualMachine *js_vm, JSBuiltinInfo *js_info, void *js_ictx, JSSymbol js_property, int js_op, JSNode *js_retval) {
  ENodeCtx *js_context = js_info->obj_context;
  ENodeInstanceCtx *js_instance = (ENodeInstanceCtx *)js_ictx;

  if(js_ictx == NULL) {
  
    return JS_PROPERTY_UNKNOWN;

  return JS_PROPERTY_FOUND;
  }

  if(js_property == js_context->s_type) {
    if(js_op == JS_BUILTIN_PROP_SET) {
      js_vm_set_err(js_vm, "type: read-only property");
      js_vm_error(js_vm);
    }
    else if(js_op == JS_BUILTIN_PROP_DELETE) {
      js_vm_set_err(js_vm, "type: undeletable property");
      js_vm_error(js_vm);
    }
    else {
#line 156 "ENode.jsi"

    	    
    	    ENode *node = js_instance->enode;
    	    EBufConst *type;
    	    
    	    type = enode_type (node);
    	    
    	    js_retval->type = JS_STRING;
    	    js_vm_make_string (js_vm, js_retval, type->str, type->len);
	    
	
#line 1028 "js-ENode.c"
    }
  } else if(js_property == js_context->s_attrib) {
    if(js_op == JS_BUILTIN_PROP_SET) {
      js_vm_set_err(js_vm, "attrib: read-only property");
      js_vm_error(js_vm);
    }
    else if(js_op == JS_BUILTIN_PROP_DELETE) {
      js_vm_set_err(js_vm, "attrib: undeletable property");
      js_vm_error(js_vm);
    }
    else {
#line 173 "ENode.jsi"

	    ENodeAttribInstanceCtx *ni;
	    JSBuiltinInfo *enode_info;
	    JSNode *enode_node;

	    enode_node = &js_vm->globals[js_vm_intern(js_vm, "ENodeAttrib")];
	    enode_info = enode_node->u.vbuiltin->info;

	    ni = js_calloc(js_vm, 1, sizeof(*ni));
	    ni->enode = js_instance->enode;
	    enode_ref (ni->enode);

	    js_vm_builtin_create(js_vm, js_retval, enode_info, ni);
	
#line 1056 "js-ENode.c"
    }
  } else if(js_property == js_context->s_attribval) {
    if(js_op == JS_BUILTIN_PROP_SET) {
      js_vm_set_err(js_vm, "attribval: read-only property");
      js_vm_error(js_vm);
    }
    else if(js_op == JS_BUILTIN_PROP_DELETE) {
      js_vm_set_err(js_vm, "attribval: undeletable property");
      js_vm_error(js_vm);
    }
    else {
#line 193 "ENode.jsi"

	    ENodeAttribInstanceCtx *ni;
	    JSBuiltinInfo *enode_info;
	    JSNode *enode_node;

	    enode_node = &js_vm->globals[js_vm_intern(js_vm, "ENodeAttribVal")];
	    enode_info = enode_node->u.vbuiltin->info;

	    ni = js_calloc(js_vm, 1, sizeof(*ni));
	    ni->enode = js_instance->enode;
	    enode_ref (ni->enode);

	    js_vm_builtin_create(js_vm, js_retval, enode_info, ni);
	
#line 1084 "js-ENode.c"
    }
  } else if(js_property == js_context->s_path) {
    if(js_op == JS_BUILTIN_PROP_SET) {
      js_vm_set_err(js_vm, "path: read-only property");
      js_vm_error(js_vm);
    }
    else if(js_op == JS_BUILTIN_PROP_DELETE) {
      js_vm_set_err(js_vm, "path: undeletable property");
      js_vm_error(js_vm);
    }
    else {
#line 213 "ENode.jsi"

    
	    ENode *node = js_instance->enode;
	    EBufFreeMe *path;
	    
	    path = enode_path (node);
	    
	    js_retval->type = JS_STRING;
	    js_vm_make_string (js_vm, js_retval, path->str, path->len);
	    ebuf_free (path);

	
#line 1110 "js-ENode.c"
    }
  } else if(js_property == js_context->s_basename) {
    if(js_op == JS_BUILTIN_PROP_SET) {
      js_vm_set_err(js_vm, "basename: read-only property");
      js_vm_error(js_vm);
    }
    else if(js_op == JS_BUILTIN_PROP_DELETE) {
      js_vm_set_err(js_vm, "basename: undeletable property");
      js_vm_error(js_vm);
    }
    else {
#line 231 "ENode.jsi"

	
	    EBufFreeMe *basename;
	    ENode *node = js_instance->enode;
	    
	    basename = enode_basename (node);
	    
	    js_retval->type = JS_STRING;
	    js_vm_make_string (js_vm, js_retval, basename->str, basename->len);
	    ebuf_free (basename);

	
#line 1136 "js-ENode.c"
    }
  } else if(js_property == js_context->s_description) {
    if(js_op == JS_BUILTIN_PROP_SET) {
      js_vm_set_err(js_vm, "description: read-only property");
      js_vm_error(js_vm);
    }
    else if(js_op == JS_BUILTIN_PROP_DELETE) {
      js_vm_set_err(js_vm, "description: undeletable property");
      js_vm_error(js_vm);
    }
    else {
#line 249 "ENode.jsi"

	
	    ENode *node = js_instance->enode;
	    gchar *description;
	    
	    description = enode_description (node);
	    
	    if (description) {
		js_retval->type = JS_STRING;
		js_vm_make_string (js_vm, js_retval, description, strlen (description));
	    } else {
		js_retval->type = JS_NULL;
	    }
	
#line 1164 "js-ENode.c"
    }
  } else 
    return JS_PROPERTY_UNKNOWN;

  return JS_PROPERTY_FOUND;
}

static void ENode_constructor(JSVirtualMachine *js_vm, JSBuiltinInfo *js_info, JSNode *js_args, JSNode *js_retval) {
  ENodeInstanceCtx *js_instance = js_calloc(js_vm, 1, sizeof(*js_instance));
  char *basename = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_free(js_instance);
    js_vm_set_err(js_vm, "ENode(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  basename = js_string_to_c_string(js_vm, &js_tempnode);
  do {
#line 139 "ENode.jsi"

	js_instance->enode = enode (basename);
	enode_ref (js_instance->enode);
    
#line 1190 "js-ENode.c"
  } while(0);
  js_free(basename);
  js_vm_builtin_create(js_vm, js_retval, js_info, js_instance);
}

static void ENode_destructor(JSBuiltinInfo *js_info, void *js_ictx) {
  ENodeInstanceCtx *js_instance = js_ictx;
  if(js_instance) {
    do {
#line 577 "ENode.jsi"

	/* g_print ("deleting node %s\n", js_instance->enode->element->str); */
	enode_unref (js_instance->enode);
    
#line 1206 "js-ENode.c"
    } while(0);
    js_free(js_instance);
  }
}

static int ENode_query(JSVirtualMachine *js_vm, JSBuiltinInfo *js_info, void *js_ictx, JSSymbol js_symbol) {
  ENodeCtx *js_context = js_info->obj_context;

  if(js_ictx == NULL) {
    return JS_PROPERTY_UNKNOWN;
  }

  if(js_symbol == js_context->s_new_child) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_type) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_attrib) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_attribval) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_path) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_basename) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_description) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_parent) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_child) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_child_rx) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_children) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_children_rx) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_children_attrib) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_children_attrib_rx) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_call) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_attrib_quiet) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_attrib_is_true) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_list_set_attribs) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_supported_attribs) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_attrib_description) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_attrib_value_type) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_attrib_possible_values) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_attribs_sync) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_destroy) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_destroy_children) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_get_xml) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_get_child_xml) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_append_xml) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_set_data) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_get_data) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_append_data) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_insert_data) return JS_PROPERTY_FOUND;
  else if(js_symbol == js_context->s_delete_data) return JS_PROPERTY_FOUND;
  else return JS_PROPERTY_UNKNOWN;
}

static int ENode_enumerate(JSVirtualMachine *js_vm, JSBuiltinInfo *js_info, void *js_ictx, int js_nth, JSNode *js_retval) {
  if(js_ictx == NULL) {
    switch(js_nth) {
      default:
        return js_vm_object_nth (js_vm, js_info->prototype, js_nth - 0, js_retval);
    }
  }

  switch(js_nth) {
    case 0:
      js_vm_make_static_string(js_vm, js_retval, "type", 4);
      return 1;
    case 1:
      js_vm_make_static_string(js_vm, js_retval, "attrib", 6);
      return 1;
    case 2:
      js_vm_make_static_string(js_vm, js_retval, "attribval", 9);
      return 1;
    case 3:
      js_vm_make_static_string(js_vm, js_retval, "path", 4);
      return 1;
    case 4:
      js_vm_make_static_string(js_vm, js_retval, "basename", 8);
      return 1;
    case 5:
      js_vm_make_static_string(js_vm, js_retval, "description", 11);
      return 1;
    default:
      return js_vm_object_nth (js_vm, js_retval->u.vbuiltin->prototype, js_nth - 6, js_retval);
  }
}

#undef js_return
#define js_return js_return_object

static void enode_global(JSVirtualMachine *js_vm, JSBuiltinInfo *js_info, void *js_instance, JSNode *js_retval, JSNode *js_args) {
  char *basename = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "enode(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  basename = js_string_to_c_string(js_vm, &js_tempnode);
  do {
#line 674 "ENode.jsi"


    ENode *node;
    JSBuiltinInfo *enode_info;

    node = enode (basename);

    if (node) {
	JSNode *enode_node;
	enode_node = &js_vm->globals[js_vm_intern(js_vm, "ENode")];
	enode_info = enode_node->u.vbuiltin->info;
	js_return_enode (js_vm, enode_info, js_retval, node);
    } else {
	js_retval->type = JS_NULL;
    }

#line 1317 "js-ENode.c"
  } while(0);
  js_free(basename);
  return;
}

#undef js_return
#define js_return js_return_object

static void enode_rx_global(JSVirtualMachine *js_vm, JSBuiltinInfo *js_info, void *js_instance, JSNode *js_retval, JSNode *js_args) {
  char *regex = NULL;
  JSNode js_tempnode;
  if (js_args->u.vinteger != 1) {
    js_vm_set_err(js_vm, "enode_rx(): illegal number of arguments");
    js_vm_error(js_vm);
  }
  js_vm_to_string(js_vm, &js_args[1], &js_tempnode);
  regex = js_string_to_c_string(js_vm, &js_tempnode);
  do {
#line 691 "ENode.jsi"


    ENode *node;
    JSBuiltinInfo *enode_info;

    node = enode_rx (regex);

    if (node) {
	JSNode *enode_node;
	enode_node = &js_vm->globals[js_vm_intern(js_vm, "ENode")];
	enode_info = enode_node->u.vbuiltin->info;
	js_return_enode (js_vm, enode_info, js_retval, node);
    } else {
	js_retval->type = JS_NULL;
    }

#line 1354 "js-ENode.c"
  } while(0);
  js_free(regex);
  return;
}

void njs_extension_entry(JSVirtualMachine *js_vm) {
  JSNode *js_node;
  JSBuiltinInfo *js_info;
  ENodeCtx *ENodectx;

  ENodectx = js_calloc(js_vm, 1, sizeof(*ENodectx));
  ENodectx->s_new_child = js_vm_intern(js_vm, "new_child");
  ENodectx->s_type = js_vm_intern(js_vm, "type");
  ENodectx->s_attrib = js_vm_intern(js_vm, "attrib");
  ENodectx->s_attribval = js_vm_intern(js_vm, "attribval");
  ENodectx->s_path = js_vm_intern(js_vm, "path");
  ENodectx->s_basename = js_vm_intern(js_vm, "basename");
  ENodectx->s_description = js_vm_intern(js_vm, "description");
  ENodectx->s_parent = js_vm_intern(js_vm, "parent");
  ENodectx->s_child = js_vm_intern(js_vm, "child");
  ENodectx->s_child_rx = js_vm_intern(js_vm, "child_rx");
  ENodectx->s_children = js_vm_intern(js_vm, "children");
  ENodectx->s_children_rx = js_vm_intern(js_vm, "children_rx");
  ENodectx->s_children_attrib = js_vm_intern(js_vm, "children_attrib");
  ENodectx->s_children_attrib_rx = js_vm_intern(js_vm, "children_attrib_rx");
  ENodectx->s_call = js_vm_intern(js_vm, "call");
  ENodectx->s_attrib_quiet = js_vm_intern(js_vm, "attrib_quiet");
  ENodectx->s_attrib_is_true = js_vm_intern(js_vm, "attrib_is_true");
  ENodectx->s_list_set_attribs = js_vm_intern(js_vm, "list_set_attribs");
  ENodectx->s_supported_attribs = js_vm_intern(js_vm, "supported_attribs");
  ENodectx->s_attrib_description = js_vm_intern(js_vm, "attrib_description");
  ENodectx->s_attrib_value_type = js_vm_intern(js_vm, "attrib_value_type");
  ENodectx->s_attrib_possible_values = js_vm_intern(js_vm, "attrib_possible_values");
  ENodectx->s_attribs_sync = js_vm_intern(js_vm, "attribs_sync");
  ENodectx->s_destroy = js_vm_intern(js_vm, "destroy");
  ENodectx->s_destroy_children = js_vm_intern(js_vm, "destroy_children");
  ENodectx->s_get_xml = js_vm_intern(js_vm, "get_xml");
  ENodectx->s_get_child_xml = js_vm_intern(js_vm, "get_child_xml");
  ENodectx->s_append_xml = js_vm_intern(js_vm, "append_xml");
  ENodectx->s_set_data = js_vm_intern(js_vm, "set_data");
  ENodectx->s_get_data = js_vm_intern(js_vm, "get_data");
  ENodectx->s_append_data = js_vm_intern(js_vm, "append_data");
  ENodectx->s_insert_data = js_vm_intern(js_vm, "insert_data");
  ENodectx->s_delete_data = js_vm_intern(js_vm, "delete_data");
  js_info = js_vm_builtin_info_create(js_vm);
  js_info->method_proc = ENode_method;
  js_info->property_proc = ENode_property;
  js_info->new_proc = ENode_constructor;
  js_info->delete_proc = ENode_destructor;
  js_info->query_proc = ENode_query;
  js_info->enumerate_proc = ENode_enumerate;
  js_info->obj_context = ENodectx;
  js_info->obj_context_delete = js_free;
  js_node = &js_vm->globals[js_vm_intern(js_vm, "ENode")];
  js_vm_builtin_create(js_vm, js_node, js_info, NULL);
  js_info = js_vm_builtin_info_create(js_vm);
  js_info->global_method_proc = enode_global;
  js_node = &js_vm->globals[js_vm_intern(js_vm, "enode")];
  js_vm_builtin_create(js_vm, js_node, js_info, NULL);

  js_info = js_vm_builtin_info_create(js_vm);
  js_info->global_method_proc = enode_rx_global;
  js_node = &js_vm->globals[js_vm_intern(js_vm, "enode_rx")];
  js_vm_builtin_create(js_vm, js_node, js_info, NULL);

  return;
}


syntax highlighted by Code2HTML, v. 0.9.1