]> andersk Git - splint.git/blob - src/shift.c
ba3202edc5c0dc7e4fa6403168628736ff801448
[splint.git] / src / shift.c
1 /*
2 ** Splint - annotation-assisted static program checker
3 ** Copyright (C) 1994-2003 University of Virginia,
4 **         Massachusetts Institute of Technology
5 **
6 ** This program is free software; you can redistribute it and/or modify it
7 ** under the terms of the GNU General Public License as published by the
8 ** Free Software Foundation; either version 2 of the License, or (at your
9 ** option) any later version.
10 ** 
11 ** This program is distributed in the hope that it will be useful, but
12 ** WITHOUT ANY WARRANTY; without even the implied warranty of
13 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 ** General Public License for more details.
15 ** 
16 ** The GNU General Public License is available from http://www.gnu.org/ or
17 ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
18 ** MA 02111-1307, USA.
19 **
20 ** For information on splint: info@splint.org
21 ** To report a bug: splint-bug@splint.org
22 ** For more information: http://www.splint.org
23 */
24
25 /*
26 ** shift.c
27 **
28 ** Larch shift sequence manager
29 **
30 **      Tokens are sent by the parser to this module.  Here they are saved
31 **      for awhile in a stack, and delivered on demand during reduce actions.
32 **      The coordination between what the parser sends here and what reduce
33 **      consumes here must be maintained by the programmer.
34 **
35 */
36
37 # include "splintMacros.nf"
38 # include "llbasic.h"
39 # include "shift.h"
40
41 /*@constant static int SHIFTMAX=200;@*/
42 # define SHIFTMAX 200
43
44 static o_ltoken Shifts[SHIFTMAX];
45 static int shiftIndex;
46
47 static bool Parsing_LSLinit = TRUE;
48
49 static bool
50 LSLGenIsEmptyShiftStack (void)
51 {
52   return (shiftIndex == 0);
53 }
54
55 void LSLGenShift (ltoken tok)
56 {
57   if (shiftIndex < SHIFTMAX)
58     {
59       Shifts[shiftIndex] = ltoken_copy (tok);
60       shiftIndex++;
61     }
62   else
63     {
64       llbuglit ("LSLGenShift: needs MoreMem ()");
65     }
66 }
67
68 extern void
69 LSLGenShiftOnly (/*@only@*/ ltoken tok)
70 {
71   if (shiftIndex < SHIFTMAX)
72     {
73       Shifts[shiftIndex] = tok;
74       shiftIndex++;
75     }
76   else
77     {
78       llbugexitlit ("LSLGenShift: needs MoreMem ()");
79     }
80 }
81
82 extern ltoken
83 LSLGenTopPopShiftStack (void)
84 {
85   ltoken res;
86
87   if (LSLGenIsEmptyShiftStack ())
88     {
89       lclfatalbug ("LSLGenTopPopShiftStack: Empty stack");
90     }
91
92   res = Shifts[--shiftIndex];
93   Shifts[shiftIndex] = ltoken_undefined;
94   /*@-retalias@*/ /*@-dependenttrans@*/
95   return res;
96   /*@=retalias@*/ /*@=dependenttrans@*/
97 }
98
99 void
100 LSLGenInit (bool LSLParse)
101 {
102   Parsing_LSLinit = LSLParse;
103 }
104
This page took 0.035215 seconds and 3 git commands to generate.