#include "expr.h" /* #define TRACE */ #if 0 #include #define DEBUG /* #define N_CONS 50 #define N_RECUP 1000 */ #define FREE_CAR 0x7FFF #define nil 0 #define true 1 typedef int expr; #endif #if 0 expr tab_cons [N_CONS] [2]; char tab_status [N_CONS]; int ptr_cons; expr (*tab_cons) [2]; char *tab_status; int ptr_cons; int n_cons; #define N_CONS n_cons char **tab_symbol; int ptr_symbol; #else struct param_expr_info *param_expr; #define N_CONS (param_expr->pe_n_cons) #define N_SYMBOL (param_expr->pe_n_symbol) #endif #if 0 #define cons_free(n) ((tab_status[n]&1) == 0) #define free_cons(n) (tab_status[n] &= ~1) #define take_cons(n) (tab_status[n] |= 1) #define ATOM(x) ((x) >= 0 || ((x) & 0x7FFF) >= N_CONS) #define INTP(x) (((x) >= 0 && (x) < 0x7FFF - N_SYMBOL) \ || ((x) & 0x7FFF) >= N_CONS) #endif int atom (expr x) { return ATOM(x); } int symbolp (expr x) { return ((x) > SYMBOL_LIMIT - N_SYMBOL); } int numberp (expr x) { return (atom(x) && !symbolp(x)); } #define intp numberp #if 0 #define num_symbol (x) (0x7FFF - (x)) #define symbol_num (m) (0x7FFF - (n)) #endif expr symbol (char *s) { int i; for (i=0; i= N_SYMBOL - 1) { fprintf (stderr, "Symbol table overflow\n"); exit (-1); } tab_symbol[ptr_symbol] = malloc (strlen(s)+1); if (tab_symbol[ptr_symbol] == NULL) { fprintf (stderr, "Insufficient memory to allocate symbol\n"); exit (-1); } strcpy (tab_symbol[ptr_symbol], s); return symbol_num(ptr_symbol++); } #if 0 #define car(x) (tab_cons[(x)&0x7FFF][0]) #define cdr(x) (tab_cons[(x)&0x7FFF][1]) #endif #if 0 union { int n; expr *adr; } tab_recup [N_RECUP]; int ptr_recup; /* indice du 1er element libre */ int n_decl; recup_item *tab_recup; #define ptr_recup (*p_ptr_recup) int ptr_recup; #define n_decl (*p_n_decl) int n_decl; int n_recup; #define N_RECUP n_recup #else #define N_RECUP (param_expr->pe_n_recup) #define n_decl (param_expr->pe_n_decl) #endif #if 0 init_expr (recup_item *tr, int nr, int *ppr, int *pnd, expr (*tc) [2], int nc, char *s, int *ppc) { int i; tab_cons = tc; n_cons = nc; tab_status = s; p_ptr_cons = ppc; for (i=0; i= N_RECUP) { fprintf (stderr, "Memory overflow (decl)\n"); exit (-2); } tab_recup [ptr_recup++].n = n_decl; n_decl = 0; } decl_expr (expr *adr) { if (ptr_recup >= N_RECUP) { fprintf (stderr, "Memory overflow (decl)\n"); exit (-2); } tab_recup [ptr_recup++].adr = adr; n_decl++; } free_expr () { ptr_recup -= n_decl; #ifdef DEBUG if (ptr_recup < 0) { fprintf (stderr, "Error: tab_recup underflow\n"); exit (-3); } #endif n_decl = tab_recup[--ptr_recup].n; } take_tree (expr x) { if (!atom(x) && cons_free(x & 0x7FFF)) { take_cons (x & 0x7FFF); take_tree (car(x)); take_tree (cdr(x)); } } gc () { int i, pr, n; for (i=0; i 0) { for (i=0; i