/*
  generic s-exp evaluator class
*/
#ifndef _E_SEXP_H
#define _E_SEXP_H

#include <glib.h>
#include <gtk/gtk.h>

#define E_SEXP(obj)         GTK_CHECK_CAST (obj, e_sexp_get_type (), ESExp)
#define E_SEXP_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, e_sexp_get_type (), ESExpClass)
#define FILTER_IS_SEXP(obj)      GTK_CHECK_TYPE (obj, e_sexp_get_type ())

typedef struct _ESExp      ESExp;
typedef struct _ESExpClass ESExpClass;

typedef struct _ESExpSymbol ESExpSymbol;
typedef struct _ESExpResult ESExpResult;
typedef struct _ESExpTerm ESExpTerm;

typedef struct _ESExpResult *(ESExpFunc)(struct _ESExp *sexp,
						   int argc,
						   struct _ESExpResult **argv,
						   void *data);

typedef struct _ESExpResult *(ESExpIFunc)(struct _ESExp *sexp,
						    int argc,
						    struct _ESExpTerm **argv,
						    void *data);
enum _ESExpResultType {
	ESEXP_RES_ARRAY_PTR=0,	/* type is a ptrarray, what it points to is implementation dependant */
	ESEXP_RES_INT,		/* type is a number */
	ESEXP_RES_STRING,	/* type is a pointer to a single string */
	ESEXP_RES_BOOL,		/* boolean type */
	ESEXP_RES_UNDEFINED	/* unknown type */
};

struct _ESExpResult {
	enum _ESExpResultType type;
	union {
		GPtrArray *ptrarray;
		int number;
		char *string;
		int bool;
	} value;
};

enum _ESExpTermType {
	ESEXP_TERM_INT	= 0,	/* integer literal */
	ESEXP_TERM_BOOL,	/* boolean literal */
	ESEXP_TERM_STRING,	/* string literal */
	ESEXP_TERM_FUNC,	/* normal function, arguments are evaluated before calling */
	ESEXP_TERM_IFUNC,	/* immediate function, raw terms are arguments */
	ESEXP_TERM_VAR,		/* variable reference */
};

struct _ESExpSymbol {
	int type;		/* ESEXP_TERM_FUNC or ESEXP_TERM_VAR */
	char *name;
	void *data;
	union {
		ESExpFunc *func;
		ESExpIFunc *ifunc;
	} f;
};

struct _ESExpTerm {
	enum _ESExpTermType type;
	union {
		char *string;
		int number;
		int bool;
		struct {
			struct _ESExpSymbol *sym;
			struct _ESExpTerm **terms;
			int termcount;
		} func;
		struct _ESExpSymbol *var;
	} value;
};



struct _ESExp {
	GtkObject object;

	GScanner *scanner;	/* for parsing text version */
	ESExpTerm *tree;	/* root of expression tree */
};

struct _ESExpClass {
	GtkObjectClass parent_class;

};

guint		e_sexp_get_type		(void);
ESExp 	       *e_sexp_new		(void);
void		e_sexp_add_function  	(ESExp *f, int scope, char *name, ESExpFunc *func, void *data);
void		e_sexp_add_ifunction  	(ESExp *f, int scope, char *name, ESExpIFunc *func, void *data);
void		e_sexp_add_variable  	(ESExp *f, int scope, char *name, ESExpTerm *value);
void		e_sexp_remove_symbol	(ESExp *f, int scope, char *name);
int		e_sexp_set_scope		(ESExp *f, int scope);

void		e_sexp_input_text		(ESExp *f, const char *text, int len);
void		e_sexp_input_file		(ESExp *f, int fd);


void		e_sexp_parse		(ESExp *f);
ESExpResult    *e_sexp_eval		(ESExp *f);

ESExpResult    *e_sexp_term_eval		(struct _ESExp *f, struct _ESExpTerm *t);
ESExpResult    *e_sexp_result_new	(int type);
void		e_sexp_result_free		(struct _ESExpResult *t);

/* utility functions for creating s-exp strings. */
void		e_sexp_encode_bool(GString *s, gboolean state);
void		e_sexp_encode_string(GString *s, const char *string);

#endif /* _E_SEXP_H */
on6/files/elliptic-6.5.3'>dependabot/npm_and_yarn/devel/electron6/files/elliptic-6.5.3</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/elliptic-6.5.4'>dependabot/npm_and_yarn/devel/electron6/files/elliptic-6.5.4</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/ini-1.3.8'>dependabot/npm_and_yarn/devel/electron6/files/ini-1.3.8</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/lodash-4.17.19'>dependabot/npm_and_yarn/devel/electron6/files/lodash-4.17.19</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/lodash.merge-4.6.2'>dependabot/npm_and_yarn/devel/electron6/files/lodash.merge-4.6.2</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/node-fetch-2.6.1'>dependabot/npm_and_yarn/devel/electron6/files/node-fetch-2.6.1</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/serve-10.1.2'>dependabot/npm_and_yarn/devel/electron6/files/serve-10.1.2</option>
<option value='gnome-3.22'>gnome-3.22</option>
<option value='gnome-3.24' selected='selected'>gnome-3.24</option>
<option value='gnome-3.26'>gnome-3.26</option>
<option value='gnome-3.28'>gnome-3.28</option>
<option value='gnome-3.32'>gnome-3.32</option>
<option value='gnome-3.36'>gnome-3.36</option>
<option value='gstreamer'>gstreamer</option>
<option value='gstreamer-1.16'>gstreamer-1.16</option>
<option value='gstreamer0.10-removal'>gstreamer0.10-removal</option>
<option value='main'>main</option>
<option value='master'>master</option>
<option value='mate-1.16'>mate-1.16</option>
<option value='mate-1.18'>mate-1.18</option>
<option value='mate-1.20'>mate-1.20</option>
<option value='mate-1.22'>mate-1.22</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>FreeBSD GNOME current development ports (https://github.com/freebsd/freebsd-ports-gnome)</td><td class='sub right'></td></tr></table>
<table class='tabs'><tr><td>
<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/about/?h=gnome-3.24'>about</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/?h=gnome-3.24'>summary</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/refs/?h=gnome-3.24&amp;id=c70543708dd95fad8547acb6e9fb4d707c152c68'>refs</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/ftp/junglemonkey/pkg-comment?h=gnome-3.24'>log</a><a class='active' href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/blame/ftp/junglemonkey/pkg-comment?h=gnome-3.24&amp;id=c70543708dd95fad8547acb6e9fb4d707c152c68'>blame</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/ftp/junglemonkey/pkg-comment?h=gnome-3.24&amp;id=c70543708dd95fad8547acb6e9fb4d707c152c68'>commit</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/diff/ftp/junglemonkey/pkg-comment?h=gnome-3.24&amp;id=c70543708dd95fad8547acb6e9fb4d707c152c68'>diff</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/stats/ftp/junglemonkey/pkg-comment?h=gnome-3.24'>stats</a></td><td class='form'><form class='right' method='get' action='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/ftp/junglemonkey/pkg-comment'>
<input type='hidden' name='h' value='gnome-3.24'/><input type='hidden' name='id' value='c70543708dd95fad8547acb6e9fb4d707c152c68'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/blame/?h=gnome-3.24&amp;id=c70543708dd95fad8547acb6e9fb4d707c152c68'>root</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/blame/ftp?h=gnome-3.24&amp;id=c70543708dd95fad8547acb6e9fb4d707c152c68'>ftp</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/blame/ftp/junglemonkey?h=gnome-3.24&amp;id=c70543708dd95fad8547acb6e9fb4d707c152c68'>junglemonkey</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/blame/ftp/junglemonkey/pkg-comment?h=gnome-3.24&amp;id=c70543708dd95fad8547acb6e9fb4d707c152c68'>pkg-comment</a></div><div class='content'>blob: 207bda2d9b982f5c3c5cb4589407e5a24b93dd85 (<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/plain/ftp/junglemonkey/pkg-comment?h=gnome-3.24&amp;id=c70543708dd95fad8547acb6e9fb4d707c152c68'>plain</a>) (<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/tree/ftp/junglemonkey/pkg-comment?h=gnome-3.24&amp;id=c70543708dd95fad8547acb6e9fb4d707c152c68'>tree</a>)
<table class='blame blob'>
<tr>
<td class='hashes'><div class='alt'><pre><span class='sha1'><a title='author  ade &lt;ade@FreeBSD.org&gt;  2000-05-19 00:08:02 +0800
committer  ade &lt;ade@FreeBSD.org&gt;  2000-05-19 00:08:02 +0800

Jungle Monkey (JM) is a distributed file sharing program for GNOME/GTK.' href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/ftp/junglemonkey/pkg-comment?h=gnome-3.24&amp;id=271ffd31d589e468acfc31f7eec84f166e371ac7'>271ffd31d589</a></span>
</pre></div></td>
<td class='linenumbers'><div class='alt'><pre><a id='n1' href='#n1'>1</a>
</pre></div></td>
<td class='lines'><div><div><div class='alt'><pre>
                                            </pre></div></div><pre><code>A distributed file sharing program for GNOME