1 /* $Header: stab.c,v 1.0.1.1 88/01/28 10:35:17 root Exp $
4 * Revision 1.0.1.1 88/01/28 10:35:17 root
5 * patch8: changed some stabents to support eval operator.
7 * Revision 1.0 87/12/18 13:06:14 root
19 static char *sig_name[] = {
75 switch (*stab->stab_name) {
76 case '0': case '1': case '2': case '3': case '4':
77 case '5': case '6': case '7': case '8': case '9': case '&':
79 paren = atoi(stab->stab_name);
80 if (curspat->spat_compex.subend[paren] &&
81 (s = getparen(&curspat->spat_compex,paren))) {
82 curspat->spat_compex.subend[paren] = Nullch;
83 str_set(stab->stab_val,s);
89 paren = curspat->spat_compex.lastparen;
90 if (curspat->spat_compex.subend[paren] &&
91 (s = getparen(&curspat->spat_compex,paren))) {
92 curspat->spat_compex.subend[paren] = Nullch;
93 str_set(stab->stab_val,s);
99 str_numset(stab->stab_val,(double)last_in_stab->stab_io->lines);
103 str_numset(stab->stab_val,(double)statusvalue);
106 s = curoutstab->stab_io->top_name;
107 str_set(stab->stab_val,s);
110 s = curoutstab->stab_io->fmt_name;
111 str_set(stab->stab_val,s);
114 str_numset(stab->stab_val,(double)curoutstab->stab_io->lines);
117 str_numset(stab->stab_val,(double)curoutstab->stab_io->lines_left);
120 str_numset(stab->stab_val,(double)curoutstab->stab_io->page);
124 str_numset(stab->stab_val,(double)(curspat->spat_compex.subbeg[0] -
125 curspat->spat_compex.subbase));
130 str_numset(stab->stab_val,(double)(curspat->spat_compex.subend[0] -
131 curspat->spat_compex.subbeg[0]));
135 *tokenbuf = record_separator;
137 str_set(stab->stab_val,tokenbuf);
140 str_numset(stab->stab_val,(double)arybase);
143 str_numset(stab->stab_val,
144 (double)((curoutstab->stab_io->flags & IOF_FLUSH) != 0) );
147 str_set(stab->stab_val,ofs);
150 str_set(stab->stab_val,ors);
153 str_set(stab->stab_val,ofmt);
156 str_numset(stab->stab_val,(double)errno);
159 return stab->stab_val;
170 if (stab->stab_flags & SF_VMAGIC) {
171 switch (stab->stab_name[0]) {
173 safefree(curoutstab->stab_io->top_name);
174 curoutstab->stab_io->top_name = str_get(str);
175 curoutstab->stab_io->top_stab = stabent(str_get(str),TRUE);
178 safefree(curoutstab->stab_io->fmt_name);
179 curoutstab->stab_io->fmt_name = str_get(str);
180 curoutstab->stab_io->fmt_stab = stabent(str_get(str),TRUE);
183 curoutstab->stab_io->page_len = (long)str_gnum(str);
186 curoutstab->stab_io->lines_left = (long)str_gnum(str);
189 curoutstab->stab_io->page = (long)str_gnum(str);
192 curoutstab->stab_io->flags &= ~IOF_FLUSH;
193 if (str_gnum(str) != 0.0) {
194 curoutstab->stab_io->flags |= IOF_FLUSH;
198 multiline = (int)str_gnum(str) != 0;
201 record_separator = *str_get(str);
206 ors = savestr(str_get(str));
211 ofs = savestr(str_get(str));
216 ofmt = savestr(str_get(str));
219 arybase = (int)str_gnum(str);
222 errno = (int)str_gnum(str); /* will anyone ever use this? */
239 break; /* "read-only" registers */
242 else if (stab == envstab && envname) {
243 setenv(envname,str_get(str));
244 /* And you'll never guess what the dog had */
245 safefree(envname); /* in its mouth... */
248 else if (stab == sigstab && signame) {
250 i = whichsig(signame); /* ...no, a brick */
251 if (strEQ(s,"IGNORE"))
253 else if (strEQ(s,"DEFAULT") || !*s)
256 signal(i,sighandler);
265 register char **sigv;
267 for (sigv = sig_name+1; *sigv; sigv++)
268 if (strEQ(signame,*sigv))
269 return sigv - sig_name;
280 stab = stabent(str_get(hfetch(sigstab->stab_hash,sig_name[sig])),TRUE);
281 savearray = defstab->stab_array;
282 defstab->stab_array = anew();
284 str_set(str,sig_name[sig]);
285 apush(defstab->stab_array,str);
286 str = cmd_exec(stab->stab_sub);
287 afree(defstab->stab_array); /* put back old $_[] */
288 defstab->stab_array = savearray;
295 return STAB_GET(stabent(name,TRUE));
303 str_set(STAB_STR(stabent(name,TRUE)),value);
311 if (!stab->stab_array)
312 stab->stab_array = anew();
320 if (!stab->stab_hash)
321 stab->stab_hash = hnew();