-/* $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
*
* 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)
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));
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);
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 '<':
STAB *stab = mstr->str_u.str_stab;
char *s;
int i;
- int sighandler();
+ static handlertype sighandler();
switch (mstr->str_rare) {
case 'E':
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;
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;
}
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));
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)
return 0;
}
+static handlertype
sighandler(sig)
int sig;
{
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);
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 */