You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.2 KiB

#ifndef _LIBSE_H
#define _LIBSE_H
#include <stdio.h>
typedef struct {
void* ptr;
int size;
int alloced;
int sexpr;
} car_t;
typedef struct cons {
union {
void* ptr;
car_t car;
};
struct cons* cdr;
} list_t;
enum _se_type {
SE_NIL=0,
SE_STRING,
SE_LIST,
};
#define SET_PARSE_NIL (1<<0) //Parse `NIL' as null pointer
#define SET_PARSE_QUOTE (1<<1) //Parse "string quotes"
#define SET_PARSE_ESCAPE (1<<2) //Parse "escape \" sequences \""
#define SET_PARSE_INSENSITIVE (1<<3) //PARSE ALL AS UPPERCASE
#define SET_NO_WRAP (1<<4) //Interpret "(one two three)" as (one two three) instead of ((one two three))
#define SETP_DEFAULT (SET_PARSE_QUOTE | SET_PARSE_ESCAPE)
#define SETP_LISP (SETP_DEFAULT | SET_PARSE_INSENSITIVE | SET_PARSE_NIL)
#define se_parsed(s) se_parse((s), SET_DEFAULT)
list_t* se_parse(const char* sexpr, unsigned int flags); //Parse string into list.
void se_free(list_t* list); //Free whole list.
void se_print(FILE* fp, const list_t* list); //Print list to fp, if fp is NULL, print to stdout.
enum _se_type se_typeof(list_t* cons); //Get type of cons's car value.
list_t* se_new(char* from, int dupe); //Create new cons.
#define se_newd(f) se_new((f), 1)
list_t* se_last(list_t* list); //Get last non-nil cons.
#endif /* _LIBSE_H */