File: si.c

package info (click to toggle)
aplus-fsf 4.22.1-6
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 22,360 kB
  • ctags: 32,380
  • sloc: cpp: 176,661; ansic: 27,018; sh: 9,855; makefile: 2,598; lisp: 2,151
file content (94 lines) | stat: -rw-r--r-- 2,101 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*****************************************************************************/
/*                                                                           */
/* Copyright (c) 1990-2008 Morgan Stanley All rights reserved.*/
/* See .../src/LICENSE for terms of distribution.                           */
/*                                                                           */
/*                                                                           */
/*****************************************************************************/

#include <stdio.h>
#include <a/ik.h>
#include <a/s.h>
#include <a/fncdcls.h>
#include <a/arthur.h>


extern I MY[];

static C *ks_buf[256];

A getRawKstack(void)
{
  I n=K-MY;
  A z=gv(It,n);
  DO(n,z->p[i]=MY[i+1]);
  R z;
}

A getSymKstack(void)
{
  I n=K-MY;I *zp,i,s;
  C **ns=get_primlist(1,1);
  A z=gv(Et,n);zp=z->p;
  i=1;
  while(i<=n)
  {
    s=MY[i++];
    if(0==s){*zp++=(I)aplus_nl;}
    else if(s>-9999&&s<6)
    {
      if(0>s)*zp++=(I)gi(-s);
      else *zp++=(I)gvi(Et,1,MS(si(ns[s])));
    }
    else if(QV(s)) 
    {
      *zp++=(I)gvi(Et,2,gsv(0,"file"),gsv(0,(C *)(s&~aplusMask)));
      *zp++=(I)gi(-MY[i++]);
    } 
    else if(QS(s))
    {
      *zp++=(I)gvi(Et,2,gsv(0,"expr"),gsv(0,(C *)(s&~aplusMask)));
    }
    else
    {
      A f=(A)s;
      sprintf((C *)ks_buf,"%s.%s",((CX)f->p[f->n+2])->s->n,XS(*f->d)->n);
      *zp++=(I)gvi(Et,2,gsv(0,"func"),gsv(0,(C *)ks_buf));
    }
  }
  R z;
}

static A lastSavedKstack=0;
static int recurseKstack=0;

void snapshotKstack()
{
  extern A sikAsAObj() ;
/* Consider changing signal handlers for segv and bus */
 if(recurseKstack==0)
    {
      recurseKstack=1;
      if( lastSavedKstack && QA(lastSavedKstack) )
	{
	  dc(lastSavedKstack);
	  lastSavedKstack=0;
	}
      lastSavedKstack=(A)sikAsAObj();
      recurseKstack=0;
    }
}

A showLastSavedKstack()
{ 
  if(recurseKstack==1)
    {
      H("\343 Internal Error _doErrorStack\n");
      return aplus_nl;
    }
  
  if( lastSavedKstack && QA(lastSavedKstack) )
    return (A)ic(lastSavedKstack);
  else
    return aplus_nl;
}