## ESExp ESExp |

## Synopsis

                        ESExp;
                        ESExpSymbol;
                        ESExpResult;
                        ESExpTerm;
    ESExp *             e_sexp_new                          (void);
    void                e_sexp_ref                          (ESExp *f);
    void                e_sexp_unref                        (ESExp *f);
    void                e_sexp_add_function                 (ESExp *f,
                                                             gint scope,
                                                             const gchar *name,
                                                             ESExpFunc *func,
                                                             gpointer data);
    void                e_sexp_add_ifunction                (ESExp *f,
                                                             gint scope,
                                                             const gchar *name,
                                                             ESExpIFunc *func,
                                                             gpointer data);
    void                e_sexp_add_variable                 (ESExp *f,
                                                             gint scope,
                                                             gchar *name,
                                                             ESExpTerm *value);
    void                e_sexp_remove_symbol                (ESExp *f,
                                                             gint scope,
                                                             const gchar *name);
    gint                e_sexp_set_scope                    (ESExp *f,
                                                             gint scope);
    void                e_sexp_input_text                   (ESExp *f,
                                                             const gchar *text,
                                                             gint len);
    void                e_sexp_input_file                   (ESExp *f,
                                                             gint fd);
    gint                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                   (struct _ESExp *f,
                                                             gint type);
    void                e_sexp_result_free                  (struct _ESExp *f,
                                                             struct _ESExpResult *t);
    void                e_sexp_resultv_free                 (struct _ESExp *f,
                                                             gint argc,
                                                             struct _ESExpResult **argv);
    void                e_sexp_encode_bool                  (GString *s,
                                                             gboolean state);
    void                e_sexp_encode_string                (GString *s,
                                                             const gchar *string);
    void                e_sexp_fatal_error                  (struct _ESExp *f,
                                                             const gchar *why,
                                                             ...);
    const gchar *       e_sexp_error                        (struct _ESExp *f);
    ESExpTerm *         e_sexp_parse_value                  (ESExp *f);

## Description

## Details

### ESExp

    typedef struct {
    #ifdef E_SEXP_IS_G_OBJECT
    	GObject parent_object;
    #else
    	gint refcount;
    #endif
    	GScanner *scanner;	/* for parsing text version */
    	ESExpTerm *tree;	/* root of expression tree */

    	/* private stuff */
    	jmp_buf failenv;
    	gchar *error;
    	GSList *operators;

    	/* TODO: may also need a pool allocator for term strings, so we dont lose them
    	   in error conditions? */
    	struct _EMemChunk *term_chunks;
    	struct _EMemChunk *result_chunks;
    } ESExp;

### ESExpSymbol

    typedef struct {
    	gint type;		/* ESEXP_TERM_FUNC or ESEXP_TERM_VAR */
    	gchar *name;
    	gpointer data;
    	union {
    		ESExpFunc *func;
    		ESExpIFunc *ifunc;
    	} f;
    } ESExpSymbol;

### ESExpResult

    typedef struct {
    	enum _ESExpResultType type;
    	union {
    		GPtrArray *ptrarray;
    		gint number;
    		gchar *string;
    		gint bool;
    		time_t time;
    	} value;
    } ESExpResult;

### ESExpTerm

    typedef struct {
    	enum _ESExpTermType type;
    	union {
    		gchar *string;
    		gint number;
    		gint bool;
    		time_t time;
    		struct {
    			struct _ESExpSymbol *sym;
    			struct _ESExpTerm **terms;
    			gint termcount;
    		} func;
    		struct _ESExpSymbol *var;
    	} value;
    } ESExpTerm;

### e_sexp_new ()

    ESExp *             e_sexp_new                          (void);

Returns : |

### e_sexp_ref ()

    void                e_sexp_ref                          (ESExp *f);

`f` : |

### e_sexp_unref ()

    void                e_sexp_unref                        (ESExp *f);

`f` : |

### e_sexp_add_function ()

    void                e_sexp_add_function                 (ESExp *f,
                                                             gint scope,
                                                             const gchar *name,
                                                             ESExpFunc *func,
                                                             gpointer data);

`f` : |
`scope` : |
`name` : |
`func` : |
`data` : |

### e_sexp_add_ifunction ()

    void                e_sexp_add_ifunction                (ESExp *f,
                                                             gint scope,
                                                             const gchar *name,
                                                             ESExpIFunc *func,
                                                             gpointer data);

`f` : |
`scope` : |
`name` : |
`func` : |
`data` : |

### e_sexp_add_variable ()

    void                e_sexp_add_variable                 (ESExp *f,
                                                             gint scope,
                                                             gchar *name,
                                                             ESExpTerm *value);

`f` : |
`scope` : |
`name` : |
`value` : |

### e_sexp_remove_symbol ()

    void                e_sexp_remove_symbol                (ESExp *f,
                                                             gint scope,
                                                             const gchar *name);

`f` : |
`scope` : |
`name` : |

### e_sexp_set_scope ()

    gint                e_sexp_set_scope                    (ESExp *f,
                                                             gint scope);

`f` : |
`scope` : |
Returns : |

### e_sexp_input_text ()

    void                e_sexp_input_text                   (ESExp *f,
                                                             const gchar *text,
                                                             gint len);

`f` : |
`text` : |
`len` : |

### e_sexp_input_file ()

    void                e_sexp_input_file                   (ESExp *f,
                                                             gint fd);

`f` : |
`fd` : |

### e_sexp_parse ()

    gint                e_sexp_parse                        (ESExp *f);

`f` : |
Returns : |

### e_sexp_eval ()

    ESExpResult *       e_sexp_eval                         (ESExp *f);

`f` : |
Returns : |

### e_sexp_term_eval ()

    ESExpResult *       e_sexp_term_eval                    (struct _ESExp *f,
                                                             struct _ESExpTerm *t);

`f` : |
`t` : |
Returns : |

### e_sexp_result_new ()

    ESExpResult *       e_sexp_result_new                   (struct _ESExp *f,
                                                             gint type);

`f` : |
`type` : |
Returns : |

### e_sexp_result_free ()

    void                e_sexp_result_free                  (struct _ESExp *f,
                                                             struct _ESExpResult *t);

`f` : |
`t` : |

### e_sexp_resultv_free ()

    void                e_sexp_resultv_free                 (struct _ESExp *f,
                                                             gint argc,
                                                             struct _ESExpResult **argv);

`f` : |
`argc` : |
`argv` : |

### e_sexp_encode_bool ()

    void                e_sexp_encode_bool                  (GString *s,
                                                             gboolean state);

Encode a bool into an s-expression `s`. Bools are encoded using t f syntax.

`s` : |
`state` : |

### e_sexp_encode_string ()

    void                e_sexp_encode_string                (GString *s,
                                                             const gchar *string);

Add a c string `string` to the s-expression stored in the gstring `s`. Quotes are added, and special characters are escaped appropriately.

`s` : | Destination string.
`string` : | String expression.

### e_sexp_fatal_error ()

    void                e_sexp_fatal_error                  (struct _ESExp *f,
                                                             const gchar *why,
                                                             ...);

`f` : |
`why` : |
`...` : |

### e_sexp_error ()

    const gchar *       e_sexp_error                        (struct _ESExp *f);

`f` : |
Returns : |

### e_sexp_parse_value ()

    ESExpTerm *         e_sexp_parse_value                  (ESExp *f);

`f` : |
Returns : |