]> thyrsus.com Git - mad.git/commitdiff
Reoder tuples from the other direction.
authorEric S. Raymond <esr@thyrsus,com>
Fri, 13 Feb 2004 21:30:15 +0000 (21:30 +0000)
committerEric S. Raymond <esr@thyrsus,com>
Fri, 13 Feb 2004 21:30:15 +0000 (21:30 +0000)
mad

diff --git a/mad b/mad
index 16851aa2b5f06d0b3f20faef043cc8f58375ba4b..a39686e07717ffe6e63415c93a2b975a78d4c14e 100755 (executable)
--- a/mad
+++ b/mad
@@ -208,6 +208,9 @@ def p_external_call(t):
 def p_external_function(t):
     "statement : EXTERNAL FUNCTION application"
     t[0] = ('external_function', tuple(t[3]))
+def p_external_function0(t):
+    "statement : EXTERNAL FUNCTION"
+    t[0] = ('external_function', ())
 
 ## FUNCTION RETURN
 def p_function_return(t):
@@ -346,7 +349,7 @@ def p_whenever_simple(t):
     t[0] = ('if', t[2], t[4])
 def p_whenever_complex(t):
     'statement : WHENEVER expression'
-    t[0] = ('whenever', t[2], t[4])
+    t[0] = ('whenever', t[2])
 def p_whenever_or(t):
     'statement : OR WHENEVER expression'
     t[0] = ('or', t[3])
@@ -526,13 +529,22 @@ def analyze():
             else:
                 format[var] = statement[2]
     # Reorder code tuples so internal functions are just after entry points
+    lastentry = -1
+    savelist = []
+    internalcount = 0
     for i in range(len(deck)):
         (file, line, label, statement) = deck[i]
         if statement[0] == 'entry':
             lastentry = i
             internalcount = 1
+            for line in savelist:
+                deck.insert(i, deck.pop(line))
+            savelist = []
         elif statement[0] == 'internal':
-            deck.insert(lastentry + internalcount, deck.pop(i))
+            if lastentry != -1:
+                deck.insert(lastentry + internalcount, deck.pop(i))
+            else:
+                savelist.append(i)
             internalcount += 1
     # Reorder code tuples so SET LIST arrays are global.
     firstentry = -1
@@ -600,7 +612,7 @@ def analyze():
                     deck[i] = (file, line, label, ('entry', name, prev[1]))
                     break
                 elif prev[0] == 'entry':
-                    croak(prev, "multiple ENTRY points are not supported")
+                    croak(deck[i-j-1],"multiple ENTRY points are not supported")
             else:
                 croak(deck[i], 'no EXTERNAL declaration matches this ENTRY')