mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	More C samples
This commit is contained in:
		
							
								
								
									
										102
									
								
								samples/C/bootstrap.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								samples/C/bootstrap.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,102 @@ | |||||||
|  | #ifndef BOOTSTRAP_H | ||||||
|  | #define BOOTSTRAP_H | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include "cxrs.h" | ||||||
|  |  | ||||||
|  | /* If we're not using GNU C, elide __attribute__ */ | ||||||
|  | #ifndef __GNUC__ | ||||||
|  | #  define  __attribute__(x)  /*NOTHING*/ | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | typedef struct object object; | ||||||
|  |  | ||||||
|  | object *true; | ||||||
|  | object *false; | ||||||
|  | object *eof; | ||||||
|  | object *empty_list; | ||||||
|  | object *global_enviroment; | ||||||
|  |  | ||||||
|  | enum obj_type { | ||||||
|  |         scm_bool, | ||||||
|  |         scm_empty_list, | ||||||
|  |         scm_eof, | ||||||
|  |         scm_char, | ||||||
|  |         scm_int, | ||||||
|  |         scm_pair, | ||||||
|  |         scm_symbol, | ||||||
|  |         scm_prim_fun, | ||||||
|  |         scm_lambda, | ||||||
|  |         scm_str, | ||||||
|  |         scm_file | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | typedef object *(*prim_proc)(object *args); | ||||||
|  |  | ||||||
|  | object *read(FILE *in); | ||||||
|  | object *eval(object *code, object *env); | ||||||
|  | void print(FILE *out, object *obj, int display); | ||||||
|  |  | ||||||
|  | int check_type(enum obj_type type, object *obj, int err_on_false); | ||||||
|  |  | ||||||
|  | static inline int is_true(object *obj) | ||||||
|  | { | ||||||
|  |         return obj != false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | object *make_int(int value); | ||||||
|  | int obj2int(object *i); | ||||||
|  |  | ||||||
|  | object *make_bool(int value); | ||||||
|  | int obj2bool(object *b); | ||||||
|  |  | ||||||
|  | object *make_char(char c); | ||||||
|  | char obj2char(object *ch); | ||||||
|  |  | ||||||
|  | object *make_str(char *str); | ||||||
|  | char *obj2str(object *str); | ||||||
|  |  | ||||||
|  | object *cons(object *car, object *cdr); | ||||||
|  | object *car(object *pair); | ||||||
|  | object *cdr(object *pair); | ||||||
|  | void set_car(object *pair, object *new); | ||||||
|  | void set_cdr(object *pair, object *new); | ||||||
|  |  | ||||||
|  | object *make_symbol(char *name); | ||||||
|  | char *sym2str(object *sym); | ||||||
|  | object *get_symbol(char *name) __attribute__((pure)); | ||||||
|  |  | ||||||
|  | object *make_prim_fun(prim_proc fun); | ||||||
|  | prim_proc obj2prim_proc(object *proc); | ||||||
|  |  | ||||||
|  | object *make_lambda(object *args, object *code, object *env); | ||||||
|  | object *lambda_code(object *lambda); | ||||||
|  | object *lambda_args(object *lambda); | ||||||
|  |  | ||||||
|  | object *make_port(FILE *handle, int direction); | ||||||
|  | int port_direction(object *port); | ||||||
|  | FILE *port_handle(object *port); | ||||||
|  | void set_port_handle_to_null(object *port); | ||||||
|  |  | ||||||
|  | /*both of these should never be called*/ | ||||||
|  | object *apply_proc(object *); | ||||||
|  | object *eval_proc(object *); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | object *maybe_add_begin(object *code); | ||||||
|  |  | ||||||
|  | void init_enviroment(object *env); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void eval_err(char *msg, object *code) __attribute__((noreturn)); | ||||||
|  |  | ||||||
|  | void define_var(object *var, object *val, object *env); | ||||||
|  | void set_var(object *var, object *val, object *env); | ||||||
|  | object *get_var(object *var, object *env); | ||||||
|  |  | ||||||
|  | object *cond2nested_if(object *cond); | ||||||
|  | object *let2lambda(object *let); | ||||||
|  | object *and2nested_if(object *and); | ||||||
|  | object *or2nested_if(object *or); | ||||||
|  |  | ||||||
|  | #endif /*include guard*/ | ||||||
		Reference in New Issue
	
	Block a user