1 #include "lightsymbols.h"
2 
3 LightSymbol::PLightSymbol LightSymbol::lsFrames[1000];
4 HANDLE LightSymbol::handleFrames[1000];
5 SZ* LightSymbol::fileNames;
6 bool LightSymbol::busted = false;
7 
8 
LightSymbol(const char * sym,int fileId,int lineNumber)9 LightSymbol::LightSymbol(const char* sym, int fileId, int lineNumber) {
10   while (busted) {
11     busted = busted;
12   }
13   this->sym = sym;
14   this->fileId = fileId;
15   this->lineNumber = lineNumber;
16 
17   LightSymbol** container = getThreadFrameContainer();
18 
19   parentFrame = *container;
20   *container = this; // shortcut for get+set current frame
21 }
22 
~LightSymbol()23 LightSymbol::~LightSymbol() {
24 
25 // assert  if (GetCurrentFrame() != this) {
26 
27   SetCurrentFrame(parentFrame);
28 }
29 
GetCallStack(char * sz,int len,const char * separator)30 bool LightSymbol::GetCallStack(char* sz, int len, const char* separator) {
31   LightSymbol* ls = GetCurrentFrame();
32   if (ls == 0) {
33     return false;
34   } else {
35     return ls->GetCallStackCore(sz, len, separator);
36   }
37 }
38 
getThreadFrameContainer()39 LightSymbol** LightSymbol::getThreadFrameContainer() {
40   //pthread_t t = pthread_self();
41   HANDLE h = (HANDLE)GetCurrentThreadId(); // f, keep handle so I don't have to recompie tyhe whole app; update toi DWORD one I really need changes in header file
42   int i = 0;
43   while (handleFrames[i] != h && handleFrames[i] != NULL && i < 1000 - 1) {
44     i++;
45   }
46   if (handleFrames[i] == h) {
47     return &lsFrames[i];
48   }
49   handleFrames[i] = h;
50   return &lsFrames[i];
51 }
52 
GetCallStackCore(char * sz,int len,const char * separator) const53 bool LightSymbol::GetCallStackCore(char* sz, int len, const char* separator) const {
54   if (busted) {
55     return false;
56   }
57   if (fileNames == NULL) { // f multithreading synchr
58     FILE* log = fopen("d:\\edisonn\\log.txt", "wt");
59 
60     if (log) { fprintf(log, "build\n");fflush(log); }
61 
62     char szLine[10000];
63     FILE* file = fopen(getenv(LIGHT_SYMBOLS_FILE), "rt");
64     if (file == NULL) {
65       busted = true;
66       return false;
67     }
68 
69     const char* trimed;
70 
71     // count number of lines
72     int id;
73     int entries = 0;
74     while (true) {
75       id = -1;
76       if (fscanf(file, "%i", &id) == 0) break;
77       if (id == -1) break;
78       if (entries <= id + 1) {
79         entries = id + 1;
80       }
81       *szLine = '\0';
82       fgets(szLine, 10000, file);
83       trimed = trim(szLine);
84     }
85 
86     fclose(file);
87     file = fopen(getenv(LIGHT_SYMBOLS_FILE), "rt");
88     if (file == NULL) {
89       busted = true;
90       return false; // f this
91     }
92 
93     if (log) { fprintf(log, "entries: %i\n", entries);fflush(log); }
94 
95     SZ* __fileNames = new SZ[entries];
96 
97     while (true) {
98       id = -1;
99       if (fscanf(file, "%i", &id) == 0) break;
100       if (id == -1) break;
101       *szLine = '\0';
102       fgets(szLine, 10000, file);
103       trimed = trim(szLine);
104 
105       if (log) { fprintf(log, "%i, %s", id, trimed); }
106 
107       // ass u me the file is correct
108 
109       __fileNames[id] = new char[strlen(trimed) + 1];
110       if (log) { fprintf(log, " - ");fflush(log); }
111       strcpy(__fileNames[id], trimed);
112       if (log) { fprintf(log, " _ \n");fflush(log); }
113     }
114     fclose(file);
115     fileNames = __fileNames;
116     if (log) { fclose(log); }
117   }
118 
119   const LightSymbol* ls = this;
120   char* szOut = sz;
121   // f security
122   while (ls != NULL && len > 1000) {
123     sprintf(szOut, "%s, %s:%i%s", ls->sym, fileNames[ls->fileId], ls->lineNumber, separator);
124     while (*szOut && len > 0) {
125       szOut++;
126       len--;
127     }
128     ls = ls->parentFrame;
129   }
130 
131   int more = 0;
132   while (ls != NULL) {
133     ls = ls->parentFrame;
134   }
135 
136   if (more > 0) {
137     sprintf(szOut, " ... %i more frames. allocate more memory!", more);
138   }
139 
140   return true;
141 }
142 
GetCurrentFrame()143 LightSymbol* LightSymbol::GetCurrentFrame() {
144   return *getThreadFrameContainer();
145 }
146 
SetCurrentFrame(LightSymbol * ls)147 void LightSymbol::SetCurrentFrame(LightSymbol* ls) {
148   *getThreadFrameContainer() = ls;
149 }
150 
trim(char * sz)151 const char* LightSymbol::trim(char* sz) {
152   if (sz == NULL) return NULL;
153 
154   while (*sz == ' ' || *sz == '\t' || *sz == '\r' || *sz == '\n' || *sz == ',')
155     sz++;
156 
157   if (*sz == '\0') return sz;
158 
159   int len = strlen(sz);
160   char* start = sz;
161   sz = sz + (len - 1);
162 
163   while (sz >= start && (*sz == ' ' || *sz == '\t' || *sz == '\r' || *sz == '\n' || *sz == ',')) {
164     *sz = '\0';
165     sz--;
166   }
167 
168   return start;
169 }
170