perl 3.0 patch #16 (combined patch)
[p5sagit/p5-mst-13.2.git] / util.c
diff --git a/util.c b/util.c
index e267578..96f142a 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1,4 +1,4 @@
-/* $Header: util.c,v 3.0.1.1 89/11/11 05:06:13 lwall Locked $
+/* $Header: util.c,v 3.0.1.4 90/03/01 10:26:48 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
@@ -6,6 +6,19 @@
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       util.c,v $
+ * Revision 3.0.1.4  90/03/01  10:26:48  lwall
+ * patch9: fbminstr() called instr() rather than ninstr()
+ * patch9: nested evals clobbered their longjmp environment
+ * patch9: piped opens returned undefined rather than 0 in child
+ * patch9: the x operator is now up to 10 times faster
+ * 
+ * Revision 3.0.1.3  89/12/21  20:27:41  lwall
+ * patch7: errno may now be a macro with an lvalue
+ * 
+ * Revision 3.0.1.2  89/11/17  15:46:35  lwall
+ * patch5: BZERO separate from BCOPY now
+ * patch5: byteorder now is a hex value
+ * 
  * Revision 3.0.1.1  89/11/11  05:06:13  lwall
  * patch2: made dup2 a little better
  * 
@@ -16,7 +29,6 @@
 
 #include "EXTERN.h"
 #include "perl.h"
-#include "errno.h"
 #include <signal.h>
 
 #ifdef I_VFORK
@@ -473,7 +485,8 @@ STR *littlestr;
 
 #ifndef lint
     if (!(littlestr->str_pok & SP_FBM))
-       return instr((char*)big,littlestr->str_ptr);
+       return ninstr((char*)big,(char*)bigend,
+               littlestr->str_ptr, littlestr->str_ptr + littlestr->str_cur);
 #endif
 
     littlelen = littlestr->str_cur;
@@ -691,8 +704,6 @@ int newlen;
     }
 }
 
-extern int errno;
-
 #ifndef VARARGS
 /*VARARGS1*/
 mess(pat,a1,a2,a3,a4)
@@ -729,11 +740,33 @@ long a1, a2, a3, a4;
 {
     extern FILE *e_fp;
     extern char *e_tmpname;
+    char *tmps;
 
     mess(pat,a1,a2,a3,a4);
     if (in_eval) {
        str_set(stab_val(stabent("@",TRUE)),buf);
-       longjmp(eval_env,1);
+       tmps = "_EVAL_";
+       while (loop_ptr >= 0 && (!loop_stack[loop_ptr].loop_label ||
+         strNE(tmps,loop_stack[loop_ptr].loop_label) )) {
+#ifdef DEBUGGING
+           if (debug & 4) {
+               deb("(Skipping label #%d %s)\n",loop_ptr,
+                   loop_stack[loop_ptr].loop_label);
+           }
+#endif
+           loop_ptr--;
+       }
+#ifdef DEBUGGING
+       if (debug & 4) {
+           deb("(Found label #%d %s)\n",loop_ptr,
+               loop_stack[loop_ptr].loop_label);
+       }
+#endif
+       if (loop_ptr < 0) {
+           in_eval = 0;
+           fatal("Bad label: %s", tmps);
+       }
+       longjmp(loop_stack[loop_ptr].loop_env, 1);
     }
     fputs(buf,stderr);
     (void)fflush(stderr);
@@ -805,6 +838,7 @@ va_dcl
     va_list args;
     extern FILE *e_fp;
     extern char *e_tmpname;
+    char *tmps;
 
 #ifndef lint
     va_start(args);
@@ -815,7 +849,28 @@ va_dcl
     va_end(args);
     if (in_eval) {
        str_set(stab_val(stabent("@",TRUE)),buf);
-       longjmp(eval_env,1);
+       tmps = "_EVAL_";
+       while (loop_ptr >= 0 && (!loop_stack[loop_ptr].loop_label ||
+         strNE(tmps,loop_stack[loop_ptr].loop_label) )) {
+#ifdef DEBUGGING
+           if (debug & 4) {
+               deb("(Skipping label #%d %s)\n",loop_ptr,
+                   loop_stack[loop_ptr].loop_label);
+           }
+#endif
+           loop_ptr--;
+       }
+#ifdef DEBUGGING
+       if (debug & 4) {
+           deb("(Found label #%d %s)\n",loop_ptr,
+               loop_stack[loop_ptr].loop_label);
+       }
+#endif
+       if (loop_ptr < 0) {
+           in_eval = 0;
+           fatal("Bad label: %s", tmps);
+       }
+       longjmp(loop_stack[loop_ptr].loop_env, 1);
     }
     fputs(buf,stderr);
     (void)fflush(stderr);
@@ -911,8 +966,8 @@ char *f;
 }
 #endif
 
-#ifndef BCOPY
 #ifndef MEMCPY
+#ifndef BCOPY
 char *
 bcopy(from,to,len)
 register char *from;
@@ -925,7 +980,9 @@ register int len;
        *to++ = *from++;
     return retval;
 }
+#endif
 
+#ifndef BZERO
 char *
 bzero(loc,len)
 register char *loc;
@@ -979,7 +1036,7 @@ char *pat, *args;
 #endif /* VARARGS */
 
 #ifdef MYSWAP
-#if BYTEORDER != 04321
+#if BYTEORDER != 0x4321
 short
 my_swap(s)
 short s;
@@ -1000,24 +1057,24 @@ register long l;
 {
     union {
        long result;
-       char c[4];
+       char c[sizeof(long)];
     } u;
 
-#if BYTEORDER == 01234
+#if BYTEORDER == 0x1234
     u.c[0] = (l >> 24) & 255;
     u.c[1] = (l >> 16) & 255;
     u.c[2] = (l >> 8) & 255;
     u.c[3] = l & 255;
     return u.result;
 #else
-#if ((BYTEORDER - 01111) & 0444) || !(BYTEORDER & 7)
+#if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
     fatal("Unknown BYTEORDER\n");
 #else
     register int o;
     register int s;
 
-    for (o = BYTEORDER - 01111, s = 0; s < 32; o >>= 3, s += 8) {
-       u.c[o & 7] = (l >> s) & 255;
+    for (o = BYTEORDER - 0x1111, s = 0; s < (sizeof(long)*8); o >>= 4, s += 8) {
+       u.c[o & 0xf] = (l >> s) & 255;
     }
     return u.result;
 #endif
@@ -1030,17 +1087,17 @@ register long l;
 {
     union {
        long l;
-       char c[4];
+       char c[sizeof(long)];
     } u;
 
-#if BYTEORDER == 01234
+#if BYTEORDER == 0x1234
     u.c[0] = (l >> 24) & 255;
     u.c[1] = (l >> 16) & 255;
     u.c[2] = (l >> 8) & 255;
     u.c[3] = l & 255;
     return u.l;
 #else
-#if ((BYTEORDER - 01111) & 0444) || !(BYTEORDER & 7)
+#if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
     fatal("Unknown BYTEORDER\n");
 #else
     register int o;
@@ -1048,15 +1105,15 @@ register long l;
 
     u.l = l;
     l = 0;
-    for (o = BYTEORDER - 01111, s = 0; s < 32; o >>= 3, s += 8) {
-       l |= (u.c[o & 7] & 255) << s;
+    for (o = BYTEORDER - 0x1111, s = 0; s < (sizeof(long)*8); o >>= 4, s += 8) {
+       l |= (u.c[o & 0xf] & 255) << s;
     }
     return l;
 #endif
 #endif
 }
 
-#endif /* BYTEORDER != 04321 */
+#endif /* BYTEORDER != 0x4321 */
 #endif /* HTONS */
 
 FILE *
@@ -1106,6 +1163,7 @@ char      *mode;
        }
        if (tmpstab = stabent("$",allstabs))
            str_numset(STAB_STR(tmpstab),(double)getpid());
+       forkprocess = 0;
        return Nullfp;
 #undef THIS
 #undef THAT
@@ -1229,3 +1287,27 @@ register int len;
     return 0;
 }
 #endif /* MEMCMP */
+
+void
+repeatcpy(to,from,len,count)
+register char *to;
+register char *from;
+int len;
+register int count;
+{
+    register int todo;
+    register char *frombase = from;
+
+    if (len == 1) {
+       todo = *from;
+       while (count-- > 0)
+           *to++ = todo;
+       return;
+    }
+    while (count-- > 0) {
+       for (todo = len; todo > 0; todo--) {
+           *to++ = *from++;
+       }
+       from = frombase;
+    }
+}