diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/xetal/stack.c |
Initial commit
Diffstat (limited to 'support/xetal/stack.c')
-rw-r--r-- | support/xetal/stack.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/support/xetal/stack.c b/support/xetal/stack.c new file mode 100644 index 0000000000..4abc8bd01b --- /dev/null +++ b/support/xetal/stack.c @@ -0,0 +1,135 @@ +/* + implementation of two stacks used in xetal, + Copyright (C) 1991 Raphael Cerf (e-mail: cerf@ens.ens.fr) + + This file is part of xetal. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 1, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "proto.h" +#include "stack.h" + +/* + * file stack + */ + +char *fich_name(e) +fich_t *e; +{ + return(e->name); +} + +FILE *fich_fd(e) +fich_t *e; +{ + return(e->fd); +} + +long fich_line(e) +fich_t *e; +{ + return(e->line); +} + +fich_t f_stack[F_MAX]; +int f_top=0; + +int is_f_stack_empty() { + return(f_top==0); +} + +int is_f_stack_full() { + return(f_top==F_MAX-1); +} + +fich_t *f_pop() { + return( &(f_stack[--f_top]) ); +} + +void f_push(e) +fich_t *e; +{ + f_stack[f_top++]=*e; +} + +fich_t *f_read() +{ + if (f_top==0) return((fich_t *)0); + else return(f_stack+f_top-1); + +} + +void f_display() { + int i; + printf("%d elements\n", f_top); + for (i=0; i<f_top; i++) + printf("%s : %d", fich_name(f_stack+i), fich_line(f_stack+i)); + printf("\n"); +} + +/* + * LEX states stack + */ + +int S_stack[S_MAX]; +int S_top=0; + +int empty_S_stack() { + while(S_top>0) S_pop(); +} + +int is_S_stack_empty() { + return(S_top==0); +} + +int is_S_stack_full() { + return(S_top==S_MAX-1); +} + +int is_S_in_stack(e) +int e; +{ + int i; + for (i=0; i<S_top; i++) { + if (S_stack[i]==e) break; + } + if (i<S_top) return 1; + else return 0; +} + +int S_pop() { + return( S_stack[--S_top] ); +} + +void S_push(e) +int e; +{ + S_stack[S_top++]=e; +} + +int S_read() +{ + if (S_top==0) return(0); + else return(*(S_stack+S_top-1)); +} + +void S_display() { + int i; + printf("%d elements\n", S_top); + for (i=0; i<S_top; i++) + printf("%d", *(S_stack+i)); + printf("\n"); +} |