5 #include <libxml/parser.h>
6 #include <libxexpr/xexpr.h>
8 gboolean dump_tree,dump_result,test_result,do_xinclude;
11 gboolean trace_symbol(const gchar *option_name,const gchar *value,gpointer data,
15 xexpr_start_tracing(xexpr,value);
19 gboolean set_param(const gchar *option_name,const gchar *value,gpointer data,
31 g_set_error(err,G_OPTION_ERROR,G_OPTION_ERROR_BAD_VALUE,
32 "No comma found in --param argument \"%s\"",value);
35 name=g_strndup(value,s-value);
36 d=strtod(s+1,&endptr);
39 g_set_error(err,G_OPTION_ERROR,G_OPTION_ERROR_BAD_VALUE,
40 "Invalid number in --param argument: \"%s\"",s);
43 if (!modf(d,&integer))
44 arg=xexpr_new_integer(integer);
46 arg=xexpr_new_number(d);
47 xexpr_var_set(xexpr,name,arg);
48 xexpr_constant_free(arg);
52 gboolean set_string_param(const gchar *option_name,const gchar *value,
53 gpointer data,GError **err)
64 g_set_error(err,G_OPTION_ERROR,G_OPTION_ERROR_BAD_VALUE,
65 "No comma found in --stringparam argument \"%s\"",value);
68 name=g_strndup(value,s-value);
69 arg=xexpr_new_string(s+1,-1);
70 xexpr_var_set(xexpr,name,arg);
71 xexpr_constant_free(arg);
75 static GOptionEntry entries[]={
76 { "dump-tree",'d',0,G_OPTION_ARG_NONE,&dump_tree,"Dump parsed file",NULL },
77 { "dump-result",'D',0,G_OPTION_ARG_NONE,&dump_result,"Dump result",NULL },
78 { "test-result",'t',0,G_OPTION_ARG_NONE,&test_result,"Test result",NULL },
79 { "trace",'T',0,G_OPTION_ARG_CALLBACK,trace_symbol,"Trace symbol",NULL },
80 { G_OPTION_REMAINING,0,0,G_OPTION_ARG_FILENAME_ARRAY,&files,NULL,
82 { "xinclude",0,0,G_OPTION_ARG_NONE,&do_xinclude,"Do XInclude processing",
84 { "param",0,0,G_OPTION_ARG_CALLBACK,set_param,
85 "Pass a (parameter,number) pair",NULL },
86 { "stringparam",0,0,G_OPTION_ARG_CALLBACK,set_string_param,
87 "Pass a (parameter,string) pair",NULL },
91 gboolean set_variable(gpointer key,gpointer value,gpointer data)
93 xexpr_var_set(data,key,value);
97 gboolean run_xexpr(Xexpr *xexpr,xmlDocPtr doc,const char *filename)
102 sub=xexpr_sub(xexpr);
103 xexpr_environment_foreach(xexpr_get_environment(xexpr),set_variable,sub);
104 if (!xexpr_parse_node(sub,xmlDocGetRootElement(doc),&err))
106 fprintf(stderr,"%s: %s\n",filename,err->message);
111 xexpr_dump(sub,stdout);
116 result=xexpr_evaluate(sub,&err);
119 fprintf(stderr,"%s: %s\n",filename,err->message);
126 printf("\nResult: ");
127 xexpr_dump(result,stdout);
131 retval=xexpr_test(result,NULL);
138 int main(int argc,char **argv)
142 int xml_options=XML_PARSE_NOENT;
143 gboolean result=TRUE;
146 GOptionContext *context;
149 context=g_option_context_new("- XEXPR interpreter");
150 group=g_option_group_new(NULL,NULL,NULL,xexpr,NULL);
151 g_option_group_add_entries(group,entries);
152 g_option_context_set_main_group(context,group);
153 if (!g_option_context_parse(context,&argc,&argv,&err))
155 fprintf(stderr,"%s\n",err->message);
159 xml_options|=XML_PARSE_XINCLUDE|XML_PARSE_NOXINCNODE;
160 if (files && files[0])
162 for(i=0;files[i];i++)
164 doc=xmlReadFile(files[i],NULL,xml_options);
169 if (do_xinclude && xmlXIncludeProcessFlags(doc,xml_options)<0)
171 else if (!run_xexpr(xexpr,doc,files[i]))
179 doc=xmlReadFd(0,NULL,NULL,xml_options);
184 if (do_xinclude && xmlXIncludeProcessFlags(doc,xml_options)<0)
186 else if (!run_xexpr(xexpr,doc,"stdin"))