aboutsummaryrefslogtreecommitdiff
path: root/unix/boot/spp/rpp/rpprat/cascod.r
blob: 073dc9a4a81ab27fe5db4335c69e0a12e8a8e0e5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#-h-  cascod			 1876  local   12/01/80  15:53:46
# cascod - generate code for case or default label
   include  defs

   subroutine cascod (lab, token)
   integer lab, token

   include COMMON_BLOCKS

   integer t, l, lb, ub, i, j, junk
   integer caslab, labgen, gnbtok

   character tok (MAXTOK)

   if (swtop <= 0) {
      call synerr ("illegal case or default.")
      return
      }
   call indent (-1)
   call outgo (lab + 1) # terminate previous case
   xfer = YES
   l = labgen (1)
   if (token == LEXCASE) { # case n[,n]... : ...
      while (caslab (lb, t) != EOF) {
	 ub = lb
	 if (t == MINUS)
	    junk = caslab (ub, t)
	 if (lb > ub) {
	    call synerr ("illegal range in case label.")
	    ub = lb
	    }
	 if (swlast + 3 > MAXSWITCH)
	    call baderr ("switch table overflow.")
	 for (i = swtop + 3; i < swlast; i = i + 3)
	    if (lb <= swstak (i))
	       break
	    else if (lb <= swstak (i+1))
	       call synerr ("duplicate case label.")
	 if (i < swlast & ub >= swstak (i))
	    call synerr ("duplicate case label.")
	 for (j = swlast; j > i; j = j - 1)   # insert new entry
	    swstak (j+2) = swstak (j-1)
	 swstak (i) = lb
	 swstak (i + 1) = ub
	 swstak (i + 2) = l
	 swstak (swtop + 1) = swstak (swtop + 1)  +  1
	 swlast = swlast + 3
	 if (t == COLON)
	    break
	 else if (t != COMMA)
	    call synerr ("illegal case syntax.")
	 }
      }
   else {   # default : ...
      t = gnbtok (tok, MAXTOK)
      if (swstak (swtop + 2) != 0)
	 call error ("multiple defaults in switch statement.")
      else
	 swstak (swtop + 2) = l
      }

   if (t == EOF)
      call synerr ("unexpected EOF.")
   else if (t != COLON)
      call error ("missing colon in case or default label.")

   xfer = NO
   call outcon (l)
   call indent (1)
   return
   end