1 #ifndef OUTPUT_H 2 #define OUTPUT_H 3 /**************************************** 4 * Computer Algebra System SINGULAR * 5 ****************************************/ 6 /* 7 * ABSTRACT: basic output 8 */ 9 #include <stdio.h> 10 #include <string.h> 11 #include "misc/auxiliary.h" 12 #include "resources/feFopen.h" 13 14 EXTERN_VAR char* feErrors; 15 EXTERN_VAR int feErrorsLen; 16 EXTERN_VAR FILE* feProtFile; 17 EXTERN_VAR int pagelength, colmax; 18 EXTERN_VAR int yy_blocklineno; 19 EXTERN_VAR int yy_noeof; 20 extern const char feNotImplemented[]; 21 EXTERN_VAR int feProt; 22 EXTERN_VAR BOOLEAN feWarn; 23 EXTERN_VAR BOOLEAN feOut; 24 EXTERN_VAR int traceit ; 25 EXTERN_VAR int traceit_stop ; 26 EXTERN_VAR void (*WarnS_callback)(const char *s); 27 28 // show entering/leaving proc: 29 #define TRACE_SHOW_PROC 1 30 // show current line-no: 31 #define TRACE_SHOW_LINENO 2 32 // show current line and wait for <RET>: 33 #define TRACE_SHOW_LINE 4 34 // show basering for all levels of the proc-stack at enteringing/leaving proc, 35 // requires RDEBUG to be defined: 36 #define TRACE_SHOW_RINGS 8 37 // show current line and do not wait for <RET>: 38 #define TRACE_SHOW_LINE1 16 39 // 40 #define TRACE_BREAKPOINT 32 41 // 42 #define TRACE_TMP_BREAKPOINT 64 43 // show all calls to kernel routines (via iparith): 44 #define TRACE_CALL 128 45 // show all assigns (via ipassign): 46 #define TRACE_ASSIGN 256 47 // show all automtic type conversions (via ipconv): 48 #define TRACE_CONV 512 49 // profiling: print line-no to smon.out: 50 #define TRACE_PROFILING 1024 51 52 53 #define SI_PROT_I 1 54 #define SI_PROT_O 2 55 #define SI_PROT_IO 3 56 57 /* the C-part: */ 58 #define mflush() fflush(stdout) 59 60 #ifdef __cplusplus 61 extern "C" { 62 #endif 63 64 void Werror(const char *fmt, ...) __attribute__((format(printf,1,2))); 65 void WerrorS_batch(const char *s); 66 void WarnS(const char *s); 67 void Print(const char* fmt, ...) __attribute__((format(printf,1,2))); 68 /* Print should not produce more than strlen(fmt)+510 characters! */ 69 70 void PrintNSpaces(const int n); 71 void PrintLn(); 72 void PrintS(const char* s); 73 74 #ifdef __cplusplus 75 } 76 /* the C++-part: */ 77 78 // a new output buffer will be allocated by StringSetS, 79 // used by several calls to StringAppend/StringAppendS 80 // and closed by StringEndS: 81 // StringEndS() returns this buffer which must be freed by omFree 82 // several buffer may be active at the same time 83 // (for example in subroutines) 84 void StringAppend(const char *fmt, ...); 85 void StringAppendS(const char *s); 86 void StringSetS(const char* s); 87 char * StringEndS(); 88 void Warn(const char *fmt, ...); 89 90 const char * eati(const char *s, int *i); 91 92 // Prints resources into string with StringAppend, etc 93 void feStringAppendResources(int warn = -1); 94 #endif /* c++ only */ 95 96 /* everything in between calls to these procedures is printed into a string 97 * which is returned by SprintEnd() 98 * Shall ONLY be used for a temporary redirection of the standard output 99 * (i.e. if Singular runs as a server) 100 */ 101 // unlike the StringSet/StringEndS stuff: 102 // only one SPrintStart/SPrintEnd buffer may be active 103 // the returned string must be free via omFree 104 void SPrintStart(); 105 char* SPrintEnd(); 106 107 /* error reporting */ 108 #ifdef __cplusplus 109 extern "C" 110 { 111 #endif 112 extern int dReportError(const char* fmt, ...); 113 #define dReportBug(s) \ 114 dReportError("Bug reported: %s\n occurred at %s,%d\n", s, __FILE__, __LINE__) 115 116 // this is just a dummy procedure which is called after the error 117 // has been reported. Within the debugger, set a breakpoint on this 118 // proc. 119 extern void dErrorBreak(); 120 #ifdef __cplusplus 121 } 122 #endif 123 124 #ifdef SING_NDEBUG 125 #define assume(x) do {} while (0) 126 #define r_assume(x) do {} while (0) 127 #else /* !SING_NDEBUG */ 128 129 #define assume_violation(s,f,l) \ 130 dReportError("assume violation at %s:%d condition: %s", f,l,s) 131 132 #define assume(x) _assume(x, __FILE__, __LINE__) 133 #define r_assume(x) _r_assume(x, __FILE__, __LINE__) 134 135 #define _assume(x, f, l) \ 136 do \ 137 { \ 138 if (! (x)) \ 139 { \ 140 assume_violation(#x, f, l); \ 141 } \ 142 } \ 143 while (0) 144 145 #define _r_assume(x, f, l) \ 146 do \ 147 { \ 148 if (! (x)) \ 149 { \ 150 assume_violation(#x, f, l); \ 151 return 0; \ 152 } \ 153 } \ 154 while (0) 155 #endif /* !SING_NDEBUG */ 156 157 #endif /* ifndef OUTPUT_H */ 158