perl 3.0 patch #14 patch #13, continued
[p5sagit/p5-mst-13.2.git] / stab.c
diff --git a/stab.c b/stab.c
index 3b235d7..9d252bb 100644 (file)
--- a/stab.c
+++ b/stab.c
@@ -1,4 +1,4 @@
-/* $Header: stab.c,v 3.0 89/10/18 15:23:23 lwall Locked $
+/* $Header: stab.c,v 3.0.1.5 90/03/12 17:00:11 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
@@ -6,6 +6,27 @@
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       stab.c,v $
+ * Revision 3.0.1.5  90/03/12  17:00:11  lwall
+ * patch13: undef $/ didn't work as advertised
+ * 
+ * Revision 3.0.1.4  90/02/28  18:19:14  lwall
+ * patch9: $0 is now always the command name
+ * patch9: you may now undef $/ to have no input record separator
+ * patch9: local($.) didn't work
+ * patch9: sometimes perl thought ordinary data was a symbol table entry
+ * patch9: stab_array() and stab_hash() weren't defined on MICROPORT
+ * 
+ * Revision 3.0.1.3  89/12/21  20:18:40  lwall
+ * patch7: ANSI strerror() is now supported
+ * patch7: errno may now be a macro with an lvalue
+ * patch7: in stab.c, sighandler() may now return either void or int
+ * 
+ * Revision 3.0.1.2  89/11/17  15:35:37  lwall
+ * patch5: sighandler() needed to be static
+ * 
+ * Revision 3.0.1.1  89/11/11  04:55:07  lwall
+ * patch2: sys_errlist[sys_nerr] is illegal
+ * 
  * Revision 3.0  89/10/18  15:23:23  lwall
  * 3.0 baseline
  * 
 
 #include <signal.h>
 
-/* This oughta be generated by Configure. */
-
 static char *sig_name[] = {
     SIG_NAME,0
 };
 
-extern int errno;
-extern int sys_nerr;
-extern char *sys_errlist[];
+#ifdef VOIDSIG
+#define handlertype void
+#else
+#define handlertype int
+#endif
 
 STR *
 stab_str(str)
@@ -39,7 +60,7 @@ STR *str;
        return stab_val(stab);
 
     switch (*stab->str_magic->str_ptr) {
-    case '0': case '1': case '2': case '3': case '4':
+    case '1': case '2': case '3': case '4':
     case '5': case '6': case '7': case '8': case '9': case '&':
        if (curspat) {
            paren = atoi(stab_name(stab));
@@ -117,9 +138,11 @@ STR *str;
        break;
 #endif
     case '/':
-       *tokenbuf = record_separator;
-       tokenbuf[1] = '\0';
-       str_nset(stab_val(stab),tokenbuf,rslen);
+       if (record_separator != 12345) {
+           *tokenbuf = record_separator;
+           tokenbuf[1] = '\0';
+           str_nset(stab_val(stab),tokenbuf,rslen);
+       }
        break;
     case '[':
        str_numset(stab_val(stab),(double)arybase);
@@ -139,8 +162,7 @@ STR *str;
        break;
     case '!':
        str_numset(stab_val(stab), (double)errno);
-       str_set(stab_val(stab),
-         errno < 0 || errno > sys_nerr ? "(unknown)" : sys_errlist[errno]);
+       str_set(stab_val(stab), strerror(errno));
        stab_val(stab)->str_nok = 1;    /* what a wonderful hack! */
        break;
     case '<':
@@ -185,7 +207,7 @@ STR *str;
     STAB *stab = mstr->str_u.str_stab;
     char *s;
     int i;
-    int sighandler();
+    static handlertype sighandler();
 
     switch (mstr->str_rare) {
     case 'E':
@@ -218,7 +240,7 @@ STR *str;
        break;
     case '*':
        s = str_get(str);
-       if (strnNE(s,"Stab",4) || str->str_cur != sizeof(STBP)) {
+       if (strNE(s,"StB") || str->str_cur != sizeof(STBP)) {
            if (!*s) {
                STBP *stbp;
 
@@ -229,7 +251,7 @@ STR *str;
                stab->str_ptr = stbp;
                stab->str_len = stab->str_cur = sizeof(STBP);
                stab->str_pok = 1;
-               strncpy(stab_magic(stab),"Stab",4);
+               strcpy(stab_magic(stab),"StB");
                stab_val(stab) = Str_new(70,0);
                stab_line(stab) = line;
            }
@@ -254,6 +276,10 @@ STR *str;
 
     case 0:
        switch (*stab->str_magic->str_ptr) {
+       case '.':
+           if (localizing)
+               savesptr((STR**)&last_in_stab);
+           break;
        case '^':
            Safefree(stab_io(curoutstab)->top_name);
            stab_io(curoutstab)->top_name = s = savestr(str_get(str));
@@ -286,8 +312,14 @@ STR *str;
            multiline = (i != 0);
            break;
        case '/':
-           record_separator = *str_get(str);
-           rslen = str->str_cur;
+           if (str->str_pok) {
+               record_separator = *str_get(str);
+               rslen = str->str_cur;
+           }
+           else {
+               record_separator = 12345;       /* fake a non-existent char */
+               rslen = 1;
+           }
            break;
        case '\\':
            if (ors)
@@ -418,6 +450,7 @@ char *sig;
     return 0;
 }
 
+static handlertype
 sighandler(sig)
 int sig;
 {
@@ -577,7 +610,7 @@ int add;
        stab->str_ptr = stbp;
        stab->str_len = stab->str_cur = sizeof(STBP);
        stab->str_pok = 1;
-       strncpy(stab_magic(stab),"Stab",4);
+       strcpy(stab_magic(stab),"StB");
        stab_val(stab) = Str_new(72,0);
        stab_line(stab) = line;
        str_magic(stab,stab,'*',name,len);
@@ -650,3 +683,26 @@ register STAB *stab;
     stab->str_cur = 0;
 }
 
+#if defined(CRIPPLED_CC) && (defined(iAPX286) || defined(M_I286) || defined(I80286))
+#define MICROPORT
+#endif
+
+#ifdef MICROPORT       /* Microport 2.4 hack */
+ARRAY *stab_array(stab)
+register STAB *stab;
+{
+    if (((STBP*)(stab->str_ptr))->stbp_array) 
+       return ((STBP*)(stab->str_ptr))->stbp_array;
+    else
+       return ((STBP*)(aadd(stab)->str_ptr))->stbp_array;
+}
+
+HASH *stab_hash(stab)
+register STAB *stab;
+{
+    if (((STBP*)(stab->str_ptr))->stbp_hash)
+       return ((STBP*)(stab->str_ptr))->stbp_hash;
+    else
+       return ((STBP*)(hadd(stab)->str_ptr))->stbp_hash;
+}
+#endif                 /* Microport 2.4 hack */