OLD | NEW |
| (Empty) |
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 | |
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 | |
23 LightSymbol::~LightSymbol() { | |
24 | |
25 // assert if (GetCurrentFrame() != this) { | |
26 | |
27 SetCurrentFrame(parentFrame); | |
28 } | |
29 | |
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 | |
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 fi
le | |
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 | |
53 bool LightSymbol::GetCallStackCore(char* sz, int len, const char* separator) con
st { | |
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 | |
143 LightSymbol* LightSymbol::GetCurrentFrame() { | |
144 return *getThreadFrameContainer(); | |
145 } | |
146 | |
147 void LightSymbol::SetCurrentFrame(LightSymbol* ls) { | |
148 *getThreadFrameContainer() = ls; | |
149 } | |
150 | |
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 } | |
OLD | NEW |