perl 1.0 patch 13: fix for faulty patch 12, plus random portability glitches
[p5sagit/p5-mst-13.2.git] / stab.c
CommitLineData
2e1b3b7e 1/* $Header: stab.c,v 1.0.1.2 88/02/02 11:25:53 root Exp $
8d063cd8 2 *
3 * $Log: stab.c,v $
2e1b3b7e 4 * Revision 1.0.1.2 88/02/02 11:25:53 root
5 * patch13: moved extern int out of function for a poor Xenix machine.
6 *
a559c259 7 * Revision 1.0.1.1 88/01/28 10:35:17 root
8 * patch8: changed some stabents to support eval operator.
9 *
8d063cd8 10 * Revision 1.0 87/12/18 13:06:14 root
11 * Initial revision
12 *
13 */
14
15#include <signal.h>
16#include "handy.h"
17#include "EXTERN.h"
18#include "search.h"
19#include "util.h"
20#include "perl.h"
21
22static char *sig_name[] = {
23 "",
24 "HUP",
25 "INT",
26 "QUIT",
27 "ILL",
28 "TRAP",
29 "IOT",
30 "EMT",
31 "FPE",
32 "KILL",
33 "BUS",
34 "SEGV",
35 "SYS",
36 "PIPE",
37 "ALRM",
38 "TERM",
39 "???"
40#ifdef SIGTSTP
41 ,"STOP",
42 "TSTP",
43 "CONT",
44 "CHLD",
45 "TTIN",
46 "TTOU",
47 "TINT",
48 "XCPU",
49 "XFSZ"
50#ifdef SIGPROF
51 ,"VTALARM",
52 "PROF"
53#ifdef SIGWINCH
54 ,"WINCH"
55#ifdef SIGLOST
56 ,"LOST"
57#ifdef SIGUSR1
58 ,"USR1"
59#endif
60#ifdef SIGUSR2
61 ,"USR2"
62#endif /* SIGUSR2 */
63#endif /* SIGLOST */
64#endif /* SIGWINCH */
65#endif /* SIGPROF */
66#endif /* SIGTSTP */
67 ,0
68 };
69
2e1b3b7e 70extern int errno;
71
8d063cd8 72STR *
73stab_str(stab)
74STAB *stab;
75{
76 register int paren;
77 register char *s;
8d063cd8 78
79 switch (*stab->stab_name) {
80 case '0': case '1': case '2': case '3': case '4':
81 case '5': case '6': case '7': case '8': case '9': case '&':
82 if (curspat) {
83 paren = atoi(stab->stab_name);
84 if (curspat->spat_compex.subend[paren] &&
85 (s = getparen(&curspat->spat_compex,paren))) {
86 curspat->spat_compex.subend[paren] = Nullch;
87 str_set(stab->stab_val,s);
88 }
89 }
90 break;
91 case '+':
92 if (curspat) {
93 paren = curspat->spat_compex.lastparen;
94 if (curspat->spat_compex.subend[paren] &&
95 (s = getparen(&curspat->spat_compex,paren))) {
96 curspat->spat_compex.subend[paren] = Nullch;
97 str_set(stab->stab_val,s);
98 }
99 }
100 break;
101 case '.':
102 if (last_in_stab) {
103 str_numset(stab->stab_val,(double)last_in_stab->stab_io->lines);
104 }
105 break;
106 case '?':
107 str_numset(stab->stab_val,(double)statusvalue);
108 break;
109 case '^':
110 s = curoutstab->stab_io->top_name;
111 str_set(stab->stab_val,s);
112 break;
113 case '~':
114 s = curoutstab->stab_io->fmt_name;
115 str_set(stab->stab_val,s);
116 break;
117 case '=':
118 str_numset(stab->stab_val,(double)curoutstab->stab_io->lines);
119 break;
120 case '-':
121 str_numset(stab->stab_val,(double)curoutstab->stab_io->lines_left);
122 break;
123 case '%':
124 str_numset(stab->stab_val,(double)curoutstab->stab_io->page);
125 break;
126 case '(':
127 if (curspat) {
128 str_numset(stab->stab_val,(double)(curspat->spat_compex.subbeg[0] -
129 curspat->spat_compex.subbase));
130 }
131 break;
132 case ')':
133 if (curspat) {
134 str_numset(stab->stab_val,(double)(curspat->spat_compex.subend[0] -
135 curspat->spat_compex.subbeg[0]));
136 }
137 break;
138 case '/':
139 *tokenbuf = record_separator;
140 tokenbuf[1] = '\0';
141 str_set(stab->stab_val,tokenbuf);
142 break;
143 case '[':
144 str_numset(stab->stab_val,(double)arybase);
145 break;
146 case '|':
147 str_numset(stab->stab_val,
148 (double)((curoutstab->stab_io->flags & IOF_FLUSH) != 0) );
149 break;
150 case ',':
151 str_set(stab->stab_val,ofs);
152 break;
153 case '\\':
154 str_set(stab->stab_val,ors);
155 break;
156 case '#':
157 str_set(stab->stab_val,ofmt);
158 break;
159 case '!':
160 str_numset(stab->stab_val,(double)errno);
161 break;
162 }
163 return stab->stab_val;
164}
165
166stabset(stab,str)
167register STAB *stab;
168STR *str;
169{
170 char *s;
171 int i;
172 int sighandler();
173
174 if (stab->stab_flags & SF_VMAGIC) {
175 switch (stab->stab_name[0]) {
176 case '^':
177 safefree(curoutstab->stab_io->top_name);
178 curoutstab->stab_io->top_name = str_get(str);
a559c259 179 curoutstab->stab_io->top_stab = stabent(str_get(str),TRUE);
8d063cd8 180 break;
181 case '~':
182 safefree(curoutstab->stab_io->fmt_name);
183 curoutstab->stab_io->fmt_name = str_get(str);
a559c259 184 curoutstab->stab_io->fmt_stab = stabent(str_get(str),TRUE);
8d063cd8 185 break;
186 case '=':
187 curoutstab->stab_io->page_len = (long)str_gnum(str);
188 break;
189 case '-':
190 curoutstab->stab_io->lines_left = (long)str_gnum(str);
191 break;
192 case '%':
193 curoutstab->stab_io->page = (long)str_gnum(str);
194 break;
195 case '|':
196 curoutstab->stab_io->flags &= ~IOF_FLUSH;
197 if (str_gnum(str) != 0.0) {
198 curoutstab->stab_io->flags |= IOF_FLUSH;
199 }
200 break;
201 case '*':
202 multiline = (int)str_gnum(str) != 0;
203 break;
204 case '/':
205 record_separator = *str_get(str);
206 break;
207 case '\\':
208 if (ors)
209 safefree(ors);
210 ors = savestr(str_get(str));
211 break;
212 case ',':
213 if (ofs)
214 safefree(ofs);
215 ofs = savestr(str_get(str));
216 break;
217 case '#':
218 if (ofmt)
219 safefree(ofmt);
220 ofmt = savestr(str_get(str));
221 break;
222 case '[':
223 arybase = (int)str_gnum(str);
224 break;
225 case '!':
226 errno = (int)str_gnum(str); /* will anyone ever use this? */
227 break;
228 case '.':
229 case '+':
230 case '&':
231 case '0':
232 case '1':
233 case '2':
234 case '3':
235 case '4':
236 case '5':
237 case '6':
238 case '7':
239 case '8':
240 case '9':
241 case '(':
242 case ')':
243 break; /* "read-only" registers */
244 }
245 }
246 else if (stab == envstab && envname) {
247 setenv(envname,str_get(str));
248 /* And you'll never guess what the dog had */
249 safefree(envname); /* in its mouth... */
250 envname = Nullch;
251 }
252 else if (stab == sigstab && signame) {
253 s = str_get(str);
254 i = whichsig(signame); /* ...no, a brick */
255 if (strEQ(s,"IGNORE"))
256 signal(i,SIG_IGN);
257 else if (strEQ(s,"DEFAULT") || !*s)
258 signal(i,SIG_DFL);
259 else
260 signal(i,sighandler);
261 safefree(signame);
262 signame = Nullch;
263 }
264}
265
266whichsig(signame)
267char *signame;
268{
269 register char **sigv;
270
271 for (sigv = sig_name+1; *sigv; sigv++)
272 if (strEQ(signame,*sigv))
273 return sigv - sig_name;
274 return 0;
275}
276
277sighandler(sig)
278int sig;
279{
280 STAB *stab;
281 ARRAY *savearray;
282 STR *str;
283
a559c259 284 stab = stabent(str_get(hfetch(sigstab->stab_hash,sig_name[sig])),TRUE);
8d063cd8 285 savearray = defstab->stab_array;
286 defstab->stab_array = anew();
287 str = str_new(0);
288 str_set(str,sig_name[sig]);
289 apush(defstab->stab_array,str);
290 str = cmd_exec(stab->stab_sub);
291 afree(defstab->stab_array); /* put back old $_[] */
292 defstab->stab_array = savearray;
293}
294
295char *
296reg_get(name)
297char *name;
298{
299 return STAB_GET(stabent(name,TRUE));
300}
301
302#ifdef NOTUSED
303reg_set(name,value)
304char *name;
305char *value;
306{
307 str_set(STAB_STR(stabent(name,TRUE)),value);
308}
309#endif
310
311STAB *
312aadd(stab)
313register STAB *stab;
314{
315 if (!stab->stab_array)
316 stab->stab_array = anew();
317 return stab;
318}
319
320STAB *
321hadd(stab)
322register STAB *stab;
323{
324 if (!stab->stab_hash)
325 stab->stab_hash = hnew();
326 return stab;
327}