Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / yagle / xyagle / XYA_error.c
1 /*------------------------------------------------------------\
2 | |
3 | Tool : XYAG |
4 | |
5 | File : Error.c |
6 | |
7 | Authors : Jacomme Ludovic |
8 | Lester Anthony |
9 | |
10 \------------------------------------------------------------*/
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <signal.h>
15 #include <setjmp.h>
16
17 #include MUT_H
18 #include SLB_H
19 #include MLO_H
20 #include CGV_H
21 #include XSB_H
22 #include XYA_H
23
24 #include "XYA_error.h"
25
26 static FILE *XyagStreamErr;
27 static FILE *XyagStreamOut;
28 static FILE *XyagStreamAll;
29
30 static char XyagErrFileName[40];
31 static char XyagOutFileName[40];
32 static char XyagAllFileName[40];
33
34 static char XyagNormalMode = 1;
35
36 static char *XyagErrorBuffer = (char *) NULL;
37
38 static char XyagInformationsBuffer[XYAG_INFORMATIONS_BUFFER_SIZE];
39 extern void (* XyagCallbackFileQuitFonction)();
40
41 /*------------------------------------------------------------\
42 | XyagExitErrorMessage |
43 \------------------------------------------------------------*/
44
45 int XYADEBUG=0;
46
47 void
48 XyagExitErrorMessage(Error)
49 int Error;
50 {
51 // return ;
52
53 if (XyagStreamErr != (FILE *) 0) {
54 fclose(XyagStreamErr);
55 unlink(XyagErrFileName);
56 }
57
58 if (XyagStreamAll != (FILE *) 0) {
59 fclose(XyagStreamAll);
60 unlink(XyagAllFileName);
61 }
62
63 if ((XyagNormalMode) &&
64 (XyagStreamOut != (FILE *) 0)) {
65 fclose(XyagStreamOut);
66 unlink(XyagOutFileName);
67 }
68 }
69
70 /*------------------------------------------------------------\
71 | XyagInitializeErrorMessage |
72 \------------------------------------------------------------*/
73
74 void
75 XyagInitializeErrorMessage(Debug)
76 char Debug;
77 {
78 XyagNormalMode = !Debug;
79
80 if (XyagCallbackFileQuitFonction != NULL)
81 XYADEBUG=0;
82 else
83 XYADEBUG=Debug;
84
85 /*
86 if (!XYADEBUG)
87 {
88 XyagStreamOut = freopen("/dev/null", "w", stdout);
89 }
90
91 return;
92 */
93 if (XyagNormalMode) {
94 sprintf(XyagOutFileName, "/tmp/%s_out_%ld", XYAG_TOOL_NAME, (long)getpid());
95 }
96
97 sprintf(XyagErrFileName, "/tmp/%s_err_%ld", XYAG_TOOL_NAME, (long)getpid());
98 sprintf(XyagAllFileName, "/tmp/%s_all_%ld", XYAG_TOOL_NAME, (long)getpid());
99
100 // XyagStreamErr = freopen(XyagErrFileName, "w+", stderr);
101 XyagStreamAll = fopen(XyagAllFileName, "w+");
102 XyagStreamErr=stderr;
103 if (XyagNormalMode) {
104 XyagStreamOut = freopen(XyagOutFileName, "w+", stdout);
105 }
106 else {
107 XyagStreamOut = XyagStreamErr;
108 }
109
110 if ((XyagStreamAll == NULL) || (XyagStreamOut == NULL) || (XyagStreamErr == NULL)) {
111 fprintf(stdout, "XYAG: Unable to open trace window !\n");
112 XyagExit(1);
113 }
114
115 if (XyagNormalMode) {
116 unlink(XyagOutFileName);
117 }
118
119 unlink(XyagErrFileName);
120
121 signal(SIGINT, XyagExitErrorMessage);
122 }
123
124 /*------------------------------------------------------------\
125 | XyagFlushErrorMessage |
126 \------------------------------------------------------------*/
127
128 void
129 XyagFlushErrorMessage()
130 {
131 int Data;
132
133 // return ;
134
135 fflush(XyagStreamErr);
136 fseek(XyagStreamErr, 0L, 0);
137
138 while ((Data = fgetc(XyagStreamErr)) != EOF) {
139 fputc(Data, XyagStreamAll);
140 }
141
142 // fclose(XyagStreamErr);
143
144 // XyagStreamErr = freopen(XyagErrFileName, "w+", stderr);
145
146 if (XyagNormalMode) {
147 fflush(XyagStreamOut);
148 fseek(XyagStreamOut, 0L, 0);
149
150 while ((Data = fgetc(XyagStreamOut)) != EOF) {
151 fputc(Data, XyagStreamAll);
152 }
153
154 fclose(XyagStreamOut);
155
156 XyagStreamOut = freopen(XyagOutFileName, "w+", stdout);
157 }
158 }
159
160 /*------------------------------------------------------------\
161 | XyagGetErrorMessage |
162 \------------------------------------------------------------*/
163 void XyagCleanErrorMessage()
164 {
165 // return ;
166 XyagFlushErrorMessage();
167 fflush(XyagStreamAll);
168 rewind(XyagStreamAll);
169 }
170
171 char *
172 XyagGetErrorMessage()
173 {
174 char *Message;
175 long Length;
176 long Index;
177 int Data;
178
179 // return NULL;
180
181 XyagFlushErrorMessage();
182
183 fflush(XyagStreamAll);
184
185 Length = ftell(XyagStreamAll);
186
187 if (XyagErrorBuffer != (char *) NULL) {
188 mbkfree(XyagErrorBuffer);
189 }
190
191 XyagErrorBuffer = mbkalloc(Length + 1);
192 Index = 0;
193
194 while (((Data = fgetc(XyagStreamAll)) != EOF) &&
195 (Index < Length)) {
196 XyagErrorBuffer[Index++] = (char) Data;
197 }
198
199 rewind(XyagStreamAll);
200
201 XyagErrorBuffer[Index] = '\0';
202
203 if (Index == 0) {
204 Message = (char *) NULL;
205 }
206 else {
207 Message = XyagErrorBuffer;
208 }
209 return (Message);
210 }
211
212 /*------------------------------------------------------------\
213 | XyagGetInformations |
214 \------------------------------------------------------------*/
215
216 char *
217 XyagGetInformations()
218 {
219 char *Scan;
220
221 XyagComputeBound();
222
223 Scan = XyagInformationsBuffer;
224
225 if (XyagFigureCgv != (cgvfig_list *) NULL) {
226 sprintf(Scan, " FIGURE : %s\n\n",
227 XyagFigureCgv->NAME);
228 }
229 else {
230 sprintf(Scan, " FIGURE : No current figure !\n\n");
231 }
232
233 Scan = Scan + strlen(Scan);
234
235 sprintf(Scan,
236 " BOUNDING BOX : \n\n XMIN : %ld\n YMIN : %ld\n XMAX : %ld\n YMAX : %ld\n\n",
237 XyagBoundXmin / XYAG_UNIT, XyagBoundYmin / XYAG_UNIT,
238 XyagBoundXmax / XYAG_UNIT, XyagBoundYmax / XYAG_UNIT);
239
240 Scan = Scan + strlen(Scan);
241 return (XyagInformationsBuffer);
242 }