source: git/libpolys/reporter/reporter.cc @ 654726

fieker-DuValspielwiese
Last change on this file since 654726 was 7fe9e13, checked in by Oleksandr Motsak <motsak@…>, 10 years ago
Renamed NDEBUG -> SING_NDEBUG in order to avoid confusion with GCC macro
  • Property mode set to 100644
File size: 8.3 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT: output system
6*/
7
8#ifdef HAVE_CONFIG_H
9#include "libpolysconfig.h"
10#endif /* HAVE_CONFIG_H */
11
12#include <stdlib.h>
13#include <stdio.h>
14#include <misc/mylimits.h>
15#include <stdarg.h>
16#include <sys/stat.h>
17#include <ctype.h>
18#include <unistd.h>
19
20#ifdef HAVE_PWD_H
21#include <pwd.h>
22#endif
23
24#include <reporter/reporter.h>
25#include <resources/feResource.h>
26#include <resources/feFopen.h>
27#include <omalloc/omalloc.h>
28//#include "options.h"
29
30#define fePutChar(c) fputc((unsigned char)(c),stdout)
31/*0 implementation */
32
33// output/print buffer:
34#define INITIAL_PRINT_BUFFER 24*1024L
35// line buffer for reading:
36// minimal value for MAX_FILE_BUFFER: 4*4096 - see Tst/Long/gcd0_l.tst
37// this is an upper limit for the size of monomials/numbers read via the interpreter
38#define MAX_FILE_BUFFER 4*4096
39static long feBufferLength=0;
40static char * feBuffer=NULL;
41static long feBufferLength_save[8];
42static char * feBuffer_save[8];
43static int feBuffer_cnt=0;
44static char * feBufferStart_save[8];
45
46
47char *  feErrors=NULL;
48int     feErrorsLen=0;
49BOOLEAN feWarn = TRUE;
50BOOLEAN feOut = TRUE;
51
52//void (*WerrorS_callback)(const char *s) = NULL;
53
54const char feNotImplemented[]="not implemented";
55
56int feProt = FALSE;
57FILE*   feProtFile;
58
59static char * feBufferStart;
60  /* only used in StringSet(S)/StringAppend(S)*/
61void StringAppend(const char *fmt, ...)
62{
63  va_list ap;
64  char *s = feBufferStart; /*feBuffer + strlen(feBuffer);*/
65  int vs;
66  long more;
67  va_start(ap, fmt);
68  if ((more=feBufferStart-feBuffer+strlen(fmt)+100)>feBufferLength)
69  {
70    more = ((more + (8*1024-1))/(8*1024))*(8*1024);
71    int l=s-feBuffer;
72    feBuffer=(char *)omReallocSize((void *)feBuffer,feBufferLength,
73                                                     more);
74#if (!defined(SING_NDEBUG)) && (!defined(OM_NDEBUG)) && defined(HAVE_CONFIG_H)
75    omMarkAsStaticAddr(feBuffer);
76#endif
77    feBufferLength=more;
78    s=feBuffer+l;
79#ifndef BSD_SPRINTF
80    feBufferStart=s;
81#endif
82  }
83#ifdef BSD_SPRINTF
84  vsprintf(s, fmt, ap);
85  while (*s!='\0') s++;
86  feBufferStart =s;
87#else
88#ifdef HAVE_VSNPRINTF
89  vs = vsnprintf(s, feBufferLength - (feBufferStart - feBuffer), fmt, ap);
90  if (vs == -1)
91  {
92    assume(0);
93    feBufferStart = feBuffer + feBufferLength -1;
94  }
95  else
96  {
97    feBufferStart += vs;
98  }
99#else
100  feBufferStart += vsprintf(s, fmt, ap);
101#endif
102#endif
103  omCheckAddrSize(feBuffer, feBufferLength);
104  va_end(ap);
105}
106
107void StringAppendS(const char *st)
108{
109  if (*st!='\0')
110  {
111    /* feBufferStart is feBuffer + strlen(feBuffer);*/
112    int l;
113    long more;
114    int ll=feBufferStart-feBuffer;
115    if ((more=ll+2+(l=strlen(st)))>feBufferLength)
116    {
117      more = ((more + (8*1024-1))/(8*1024))*(8*1024);
118      feBuffer=(char *)omreallocSize((void *)feBuffer,feBufferLength,
119                                                       more);
120      feBufferLength=more;
121      feBufferStart=feBuffer+ll;
122    }
123    strcat(feBufferStart, st);
124    feBufferStart +=l;
125  }
126}
127
128void StringSetS(const char *st)
129{
130  feBuffer_save[feBuffer_cnt]=feBuffer;
131  feBuffer=(char*)omAlloc0(INITIAL_PRINT_BUFFER);
132  feBufferLength_save[feBuffer_cnt]=feBufferLength;
133  feBufferLength=INITIAL_PRINT_BUFFER;
134  feBufferStart_save[feBuffer_cnt]=feBufferStart;
135  feBufferStart=feBuffer;
136  feBuffer_cnt++;
137  int l;
138  long more;
139  if ((l=strlen(st))>feBufferLength)
140  {
141    more = ((l + (4*1024-1))/(4*1024))*(4*1024);
142    feBuffer=(char *)omReallocSize((ADDRESS)feBuffer,feBufferLength,
143                                                     more);
144    feBufferLength=more;
145  }
146  strcpy(feBuffer,st);
147  feBufferStart=feBuffer+l;
148}
149
150char * StringEndS()
151{
152  char *r=feBuffer;
153  feBuffer_cnt--;
154  feBuffer=feBuffer_save[feBuffer_cnt];
155  feBufferLength=feBufferLength_save[feBuffer_cnt];
156  feBufferStart=feBufferStart_save[feBuffer_cnt];
157  if (strlen(r)<1024)
158  {
159    char *s=omStrDup(r); omFree(r); r=s;
160  }
161  return r;
162}
163
164#ifdef HAVE_TCL
165extern "C" {
166void PrintTCLS(const char c, const char *s)
167{
168  int l=strlen(s);
169  if (l>0) PrintTCL(c,l,s);
170}
171}
172#endif
173
174void WerrorS_batch(const char *s)
175{
176  if (feErrors==NULL)
177  {
178    feErrors=(char *)omAlloc(256);
179    feErrorsLen=256;
180    *feErrors = '\0';
181  }
182  else
183  {
184    if (((int)(strlen((char *)s)+ 20 +strlen(feErrors)))>=feErrorsLen)
185    {
186      feErrors=(char *)omReallocSize(feErrors,feErrorsLen,feErrorsLen+256);
187      feErrorsLen+=256;
188    }
189  }
190  strcat(feErrors, "Singular error: ");
191  strcat(feErrors, (char *)s);
192  errorreported = TRUE;
193}
194
195void Werror(const char *fmt, ...)
196{
197  va_list ap;
198  va_start(ap, fmt);
199  char *s=(char *)omAlloc(256);
200  vsprintf(s, fmt, ap);
201  WerrorS(s);
202  omFreeSize(s,256);
203  va_end(ap);
204}
205
206void WarnS(const char *s)
207{
208  #define warn_str "// ** "
209#ifdef HAVE_TCL
210  if (tclmode)
211  {
212    PrintTCLS('W',warn_str);
213    PrintTCLS('W',s);
214    PrintTCLS('W',"\n");
215  }
216  else
217#endif
218  if (feWarn) /* ignore warnings if option --no-warn was given */
219  {
220    fwrite(warn_str,1,6,stdout);
221    fwrite(s,1,strlen(s),stdout);
222    fwrite("\n",1,1,stdout);
223    fflush(stdout);
224    if (feProt&SI_PROT_O)
225    {
226      fwrite(warn_str,1,6,feProtFile);
227      fwrite(s,1,strlen(s),feProtFile);
228      fwrite("\n",1,1,feProtFile);
229    }
230  }
231}
232
233void Warn(const char *fmt, ...)
234{
235  va_list ap;
236  va_start(ap, fmt);
237  char *s=(char *)omAlloc(256);
238  vsprintf(s, fmt, ap);
239  WarnS(s);
240  omFreeSize(s,256);
241  va_end(ap);
242}
243
244
245// some routines which redirect the output of print to a string
246static char* sprint = NULL;
247static char* sprint_backup = NULL;
248void SPrintStart()
249{
250  if (sprint!=NULL)
251  {
252    if (sprint_backup!=NULL) WerrorS("internal error: SPrintStart");
253    else sprint_backup=sprint;
254  }
255  sprint = omStrDup("");
256}
257
258static void SPrintS(const char* s)
259{
260  omCheckAddr(sprint);
261  if ((s == NULL)||(*s == '\0')) return;
262  int ls = strlen(s);
263
264  char* ns;
265  int l = strlen(sprint);
266  ns = (char*) omAlloc((l + ls + 1)*sizeof(char));
267  if (l > 0) strcpy(ns, sprint);
268
269  strcpy(&(ns[l]), s);
270  omFree(sprint);
271  sprint = ns;
272  omCheckAddr(sprint);
273}
274
275char* SPrintEnd()
276{
277  char* ns = sprint;
278  sprint = sprint_backup;
279  sprint_backup=NULL;
280  omCheckAddr(ns);
281  return ns;
282}
283
284// Print routines
285extern "C" {
286void PrintS(const char *s)
287{
288  if (sprint != NULL)
289  {
290    SPrintS(s);
291    return;
292  }
293  else if (feOut) /* do not print when option --no-out was given */
294  {
295
296#ifdef HAVE_TCL
297    if (tclmode)
298    {
299      PrintTCLS('N',s);
300    }
301    else
302#endif
303    {
304      fwrite(s,1,strlen(s),stdout);
305      fflush(stdout);
306      if (feProt&SI_PROT_O)
307      {
308        fwrite(s,1,strlen(s),feProtFile);
309      }
310    }
311  }
312}
313
314void PrintLn()
315{
316  PrintS("\n");
317}
318
319void Print(const char *fmt, ...)
320{
321  if (sprint != NULL)
322  {
323    va_list ap;
324    va_start(ap, fmt);
325    omCheckAddr(sprint);
326    int ls = strlen(fmt);
327    if (fmt != NULL && ls > 0)
328    {
329      char* ns;
330      int l = strlen(sprint);
331      ns = (char*) omAlloc(sizeof(char)*(ls + l + 512));
332      if (l > 0)  strcpy(ns, sprint);
333
334#ifdef HAVE_VSNPRINTF
335      l = vsnprintf(&(ns[l]), ls+511, fmt, ap);
336      assume(l != -1);
337#else
338      vsprintf(&(ns[l]), fmt, ap);
339#endif
340      omCheckAddr(ns);
341      omFree(sprint);
342      sprint = ns;
343    }
344    va_end(ap);
345    return;
346  }
347  else if (feOut)
348  {
349    va_list ap;
350    va_start(ap, fmt);
351    int l;
352    long ls=strlen(fmt);
353    char *s=(char *)omAlloc(ls+512);
354#ifdef HAVE_VSNPRINTF
355    l = vsnprintf(s, ls+511, fmt, ap);
356    if ((l==-1)||(s[l]!='\0')||(l!=strlen(s)))
357    {
358      printf("Print problem: l=%d, fmt=>>%s<<\n",l,fmt);
359    }
360#else
361    vsprintf(s, fmt, ap);
362#endif
363    PrintS(s);
364    omFree(s);
365    va_end(ap);
366  }
367}
368void PrintNSpaces(const int n)
369{
370  int l=n-1;
371  while(l>=0) { PrintS(" "); l--; }
372}
373
374/* end extern "C" */
375}
376
377const char* eati(const char *s, int *i)
378{
379  int l=0;
380
381  if    (*s >= '0' && *s <= '9')
382  {
383    *i = 0;
384    while (*s >= '0' && *s <= '9')
385    {
386      *i *= 10;
387      *i += *s++ - '0';
388      l++;
389      if ((l>=MAX_INT_LEN)||((*i) <0))
390      {
391        s-=l;
392        Werror("`%s` greater than %d(max. integer representation)",
393                s,MAX_INT_VAL);
394        return s;
395      }
396    }
397  }
398  else *i = 1;
399  return s;
400}
401
402void feStringAppendResources(int warn)
403{
404  int i = 0;
405  char* r;
406  StringAppend("%-10s:\t%s\n", "argv[0]", feArgv0);
407  while (feResourceConfigs[i].key != NULL)
408  {
409    r = feResource(feResourceConfigs[i].key, warn);
410    StringAppend("%-10s:\t%s\n", feResourceConfigs[i].key,
411                 (r != NULL ? r : ""));
412    i++;
413  }
414}
Note: See TracBrowser for help on using the repository browser.