/* Read input lines till we get to a TO string.
    Increase nesting depth if we get a FROM string.
    Put the results into sb at PTR.
+   FROM may be NULL (or will be ignored) if TO is "ENDR".
    Add a new input line to an sb using GET_LINE.
    Return 1 on success, 0 on unexpected EOF.  */
 
 buffer_and_nest (const char *from, const char *to, sb *ptr,
                 int (*get_line) (sb *))
 {
-  int from_len = strlen (from);
+  int from_len;
   int to_len = strlen (to);
   int depth = 1;
   int line_start = ptr->len;
 
   int more = get_line (ptr);
 
+  if (to_len == 4 && strcasecmp(to, "ENDR") == 0)
+    {
+      from = NULL;
+      from_len = 0;
+    }
+  else
+    from_len = strlen (from);
+
   while (more)
     {
       /* Try and find the first pseudo op on the line.  */
       int i = line_start;
 
-      if (! macro_alternate && ! macro_mri)
+      if (! NO_PSEUDO_DOT && ! flag_m68k_mri)
        {
          /* With normal syntax we can suck what we want till we get
             to the dot.  With the alternate, labels have to start in
-            the first column, since we cant tell what's a label and
+            the first column, since we can't tell what's a label and
             whats a pseudoop.  */
 
          /* Skip leading whitespace.  */
        i++;
 
       if (i < ptr->len && (ptr->ptr[i] == '.'
-                          || macro_alternate
+                          || NO_PSEUDO_DOT
                           || macro_mri))
        {
-         if (ptr->ptr[i] == '.')
+         if (! flag_m68k_mri && ptr->ptr[i] == '.')
            i++;
-         if (strncasecmp (ptr->ptr + i, from, from_len) == 0
+         if (from == NULL
+            && strncasecmp (ptr->ptr + i, "IRPC", from_len = 4) != 0
+            && strncasecmp (ptr->ptr + i, "IRP", from_len = 3) != 0
+            && strncasecmp (ptr->ptr + i, "IREPC", from_len = 5) != 0
+            && strncasecmp (ptr->ptr + i, "IREP", from_len = 4) != 0
+            && strncasecmp (ptr->ptr + i, "REPT", from_len = 4) != 0
+            && strncasecmp (ptr->ptr + i, "REP", from_len = 3) != 0)
+           from_len = 0;
+         if ((from != NULL
+              ? strncasecmp (ptr->ptr + i, from, from_len) == 0
+              : from_len > 0)
              && (ptr->len == (i + from_len)
                  || ! ISALNUM (ptr->ptr[i + from_len])))
            depth++;
 const char *
 expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *))
 {
-  const char *mn;
   sb sub;
   formal_entry f;
   struct hash_control *h;
   const char *err;
 
-  if (irpc)
-    mn = "IRPC";
-  else
-    mn = "IRP";
-
   idx = sb_skip_white (idx, in);
 
   sb_new (&sub);
-  if (! buffer_and_nest (mn, "ENDR", &sub, get_line))
+  if (! buffer_and_nest (NULL, "ENDR", &sub, get_line))
     return _("unexpected end of file in irp or irpc");
 
   sb_new (&f.name);
 
--- /dev/null
+#objdump: -r
+#name: nested irp/irpc/rept
+
+.*: +file format .*
+
+RELOCATION RECORDS FOR .*
+OFFSET[        ]+TYPE[         ]+VALUE.*
+0+00[  ]+[a-zA-Z0-9_]+[        ]+irp_irp_19
+0+04[  ]+[a-zA-Z0-9_]+[        ]+irp_irp_18
+0+08[  ]+[a-zA-Z0-9_]+[        ]+irp_irp_29
+0+0c[  ]+[a-zA-Z0-9_]+[        ]+irp_irp_28
+0+10[  ]+[a-zA-Z0-9_]+[        ]+irp_irpc_19
+0+14[  ]+[a-zA-Z0-9_]+[        ]+irp_irpc_18
+0+18[  ]+[a-zA-Z0-9_]+[        ]+irp_irpc_29
+0+1c[  ]+[a-zA-Z0-9_]+[        ]+irp_irpc_28
+0+20[  ]+[a-zA-Z0-9_]+[        ]+irp_rept_1
+0+24[  ]+[a-zA-Z0-9_]+[        ]+irp_rept_1
+0+28[  ]+[a-zA-Z0-9_]+[        ]+irp_rept_2
+0+2c[  ]+[a-zA-Z0-9_]+[        ]+irp_rept_2
+0+30[  ]+[a-zA-Z0-9_]+[        ]+irpc_irp_19
+0+34[  ]+[a-zA-Z0-9_]+[        ]+irpc_irp_18
+0+38[  ]+[a-zA-Z0-9_]+[        ]+irpc_irp_29
+0+3c[  ]+[a-zA-Z0-9_]+[        ]+irpc_irp_28
+0+40[  ]+[a-zA-Z0-9_]+[        ]+irpc_irpc_19
+0+44[  ]+[a-zA-Z0-9_]+[        ]+irpc_irpc_18
+0+48[  ]+[a-zA-Z0-9_]+[        ]+irpc_irpc_29
+0+4c[  ]+[a-zA-Z0-9_]+[        ]+irpc_irpc_28
+0+50[  ]+[a-zA-Z0-9_]+[        ]+irpc_rept_1
+0+54[  ]+[a-zA-Z0-9_]+[        ]+irpc_rept_1
+0+58[  ]+[a-zA-Z0-9_]+[        ]+irpc_rept_2
+0+5c[  ]+[a-zA-Z0-9_]+[        ]+irpc_rept_2
+0+60[  ]+[a-zA-Z0-9_]+[        ]+rept_irp_9
+0+64[  ]+[a-zA-Z0-9_]+[        ]+rept_irp_8
+0+68[  ]+[a-zA-Z0-9_]+[        ]+rept_irp_9
+0+6c[  ]+[a-zA-Z0-9_]+[        ]+rept_irp_8
+0+70[  ]+[a-zA-Z0-9_]+[        ]+rept_irpc_9
+0+74[  ]+[a-zA-Z0-9_]+[        ]+rept_irpc_8
+0+78[  ]+[a-zA-Z0-9_]+[        ]+rept_irpc_9
+0+7c[  ]+[a-zA-Z0-9_]+[        ]+rept_irpc_8
+0+80[  ]+[a-zA-Z0-9_]+[        ]+rept_rept
+0+84[  ]+[a-zA-Z0-9_]+[        ]+rept_rept
+0+88[  ]+[a-zA-Z0-9_]+[        ]+rept_rept
+0+8c[  ]+[a-zA-Z0-9_]+[        ]+rept_rept