aboutsummaryrefslogtreecommitdiff
path: root/unix/boot/spp/rpp/ratlibr/gfnarg.r
blob: 3940959246e1f44a70d4853c0df056ffbf4b5822 (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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
include	defs

# gfnarg --- get the next file name from the argument list

   integer function gfnarg (name, state)
   character name (ARB)
   integer state (4)

   integer l
   integer getarg, getlin

   filedes fd
   filedes open

   string in1 "/dev/stdin1"
   string in2 "/dev/stdin2"
   string in3 "/dev/stdin3"

   repeat {

      if (state (1) == 1) {
	 state (1) = 2	      # new state
	 state (2) = 1	      # next argument
	 state (3) = ERR      # current input file
	 state (4) = 0	      # input file count
	 }

      else if (state (1) == 2) {
	 if (getarg (state (2), name, MAXARG) != EOF) {
	    state (1) = 2     # stay in same state
	    state (2) = state (2) + 1  # bump argument count
	    if (name (1) != MINUS) {
	       state (4) = state (4) + 1    # bump input file count
	       return (OK)
	       }
	    else if (name (2) == EOS) {
	       call scopy (in1, 1, name, 1)
	       state (4) = state (4) + 1    # bump input file count
	       return (OK)
	       }
	    else if (name (2) == DIG1 & name (3) == EOS) {
	       call scopy (in1, 1, name, 1)
	       state (4) = state (4) + 1    # bump input file count
	       return (OK)
	       }
	    else if (name (2) == DIG2 & name (3) == EOS) {
	       call scopy (in2, 1, name, 1)
	       state (4) = state (4) + 1    # bump input file count
	       return (OK)
	       }
	    else if (name (2) == DIG3 & name (3) == EOS) {
	       call scopy (in3, 1, name, 1)
	       state (4) = state (4) + 1    # bump input file count
	       return (OK)
	       }

	    else if (name (2) == LETN | name (2) == BIGN) {
	       state (1) = 3	       # new state
	       if (name (3) == EOS)
		  state (3) = STDIN
	       else if (name (3) == DIG1 & name (4) == EOS)
		  state (3) = STDIN1
	       else if (name (3) == DIG2 & name (4) == EOS)
		  state (3) = STDIN2
	       else if (name (3) == DIG3 & name (4) == EOS)
		  state (3) = STDIN3
	       else {
		  state (3) = open (name (3), READ)
		  if (state (3) == ERR) {
		     call putlin (name, ERROUT)
		     call remark (":  can't open.")
		     state (1) = 2
		     }
		  }
	       }
	    else
	       return (ERR)
	    }

	 else
	    state (1) = 4     # EOF state
	 }

      else if (state (1) == 3) {
	 l = getlin (name, state (3))
	 if (l != EOF) {
	    name (l) = EOS
	    state (4) = state (4) + 1  # bump input file count
	    return (OK)
	    }
	 if (fd != ERR & fd != STDIN)
	    call close (state (3))
	 state (1) = 2
	 }

      else if (state (1) == 4) {
	 state (1) = 5
	 if (state (4) == 0) {# no input files
	    call scopy (in1, 1, name, 1)
	    return (OK)
	    }
	 break
	 }

      else if (state (1) == 5)
	 break

      else
	 call error ("in gfnarg:  bad state (1) value.")

      } # end of infinite repeat

   name (1) = EOS
   return (EOF)
   end