* Bug 15599 fixed: now degree of zero polynomial is -Inf
[scilab.git] / scilab / modules / ast / includes / types / tostring_common.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2009 - DIGITEO - Antoine ELIAS
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef __TOSTRING_COMMON_HXX__
17 #define __TOSTRING_COMMON_HXX__
18
19 #include <sstream>
20 #include "os_string.h"
21 #include "dynlib_ast.h"
22
23 #define SIZE_BETWEEN_TWO_VALUES         1
24 #define SPACE_BETWEEN_TWO_VALUES        L" "
25 #define SIZE_BOOL                       1
26 #define SIZE_BETWEEN_BOOL               1
27 #define SPACE_BETWEEN_BOOL              L" "
28 #define SIGN_LENGTH                     1
29 #define NO_SIGN                         L" "
30 #define MINUS_STRING                    L"-"
31 #define PLUS_STRING                     L"+"
32 #define SYMBOL_I                        L"i"
33
34
35 #define MAX_LINES                       100
36 #ifndef _MSC_VER
37 #include <inttypes.h>
38 #define _abs64(x) llabs(x)
39 #endif
40
41 typedef struct __DOUBLE_FORMAT__
42 {
43     __DOUBLE_FORMAT__() : iWidth(0), iPrec(0), bExp(false), bPrintPoint(true), bPrintPlusSign(false), bPrintOne(true), bPaddSign(true), iSignLen(SIGN_LENGTH), bPrintBlank(true), bPrintComplexPlusSpace(false) {}
44     int iWidth;
45     int iPrec;
46     bool bExp;
47     bool bPrintPoint;
48     bool bPrintPlusSign;
49     bool bPrintOne;
50     bool bPaddSign;
51     int iSignLen;
52     bool bPrintBlank;
53     bool bPrintComplexPlusSpace;
54 } DoubleFormat;
55
56 /*double*/
57 //void getDoubleFormat(double _dblVal, int *_piWidth, int *_piPrec, bool* _pExp);
58 EXTERN_AST void getDoubleFormat(double _dblVal, DoubleFormat* _pDF);
59 //void getComplexFormat(double _dblR, double _dblI, int *_piTotalWidth, int *_piWidthR, int *_piWidthI, int *_piPrecR, int *_piPrecI, bool* _pExpR, bool* _pExpI);
60 EXTERN_AST void getComplexFormat(double _dblR, double _dblI, int *_piTotalWidth, DoubleFormat* _pDFR, DoubleFormat* _pDFI);
61
62 //addDoubleValue(int _iWidth, int _iPrec, bool _bExp, bool _bPrintPoint = true, bool _bPrintPlusSign = false, bool _bPrintOne = true, bool _bPaddSign = true, int _iSignLen = 2);
63 EXTERN_AST void addDoubleValue(std::wostringstream *_postr, double _dblVal, DoubleFormat* _pDF);
64 EXTERN_AST void addDoubleComplexValue(std::wostringstream *_postr, double _dblR, double _dblI, int _iTotalLen, DoubleFormat* _pDFR, DoubleFormat* _pDFI);
65
66 /*Common*/
67 EXTERN_AST void configureStream(std::wostringstream *_postr, int _iWidth, int _iPrec, char _cFill);
68 EXTERN_AST void addSpaces(std::wostringstream *_postr, int _iSpace);
69 void addColumnString(std::wostringstream& ostr, int _iFrom, int _iTo);
70 EXTERN_AST void printEmptyString(std::wostringstream& ostr);
71 EXTERN_AST void printDoubleValue(std::wostringstream& ostr, double val);
72 EXTERN_AST void printComplexValue(std::wostringstream& ostr, double val_r, double val_i);
73
74 /*int*/
75 /*
76   We will specify all "signed" / "unsigned" cases to avoid Compilation Warning
77 */
78
79 template <typename T>
80 void getUnsignedIntFormat(T _TVal, int *_piWidth)
81 {
82     if (_TVal == 0)
83     {
84         *_piWidth = 0;
85     }
86     else
87     {
88         *_piWidth = static_cast<int>(log10(static_cast<long double>(_TVal)) + 1);
89     }
90     *_piWidth += 1;
91 }
92
93 template <typename T>
94 void getSignedIntFormat(T _TVal, int *_piWidth)
95 {
96     if (_TVal == 0)
97     {
98         *_piWidth = 0;
99     }
100     else
101     {
102         unsigned long long a = _abs64(_TVal);
103         long double b = static_cast<long double>(a);
104         long double c = log10(b + 1);
105         *_piWidth = static_cast<int>(c);
106         //*_piWidth = static_cast<int>(log10(static_cast<unsigned long double>(_abs64(_TVal))) + 1);
107     }
108     *_piWidth += 1;
109 }
110
111 template <typename T>
112 void addUnsignedIntValue(std::wostringstream *_postr, T _TVal, int _iWidth, bool bPrintPlusSign = false, bool bPrintOne = true)
113 {
114     const wchar_t * pwstSign = PLUS_STRING;
115     wchar_t pwstFormat[32];
116     wchar_t pwstOutput[32];
117     if (bPrintPlusSign == true)
118     {
119         pwstSign = PLUS_STRING;
120     }
121     else
122     {
123         pwstSign = NO_SIGN;
124     }
125
126     if (bPrintOne == true || _TVal != 1)
127     {
128         os_swprintf(pwstFormat, 32, L" %ls%llu", pwstSign, (unsigned long long)(_TVal));
129         os_swprintf(pwstOutput, 32, L"%*ls", _iWidth + 1, pwstFormat);//+1 for blank
130         *_postr << pwstOutput;
131     }
132 }
133
134 template <typename T>
135 void addSignedIntValue(std::wostringstream *_postr, T _TVal, int _iWidth, bool bPrintPlusSign = false, bool bPrintOne = true)
136 {
137     const wchar_t* pwstSign = NULL;
138     wchar_t pwstFormat[32];
139     wchar_t pwstOutput[32];
140     if (bPrintPlusSign == true)
141     {
142         pwstSign = (_TVal < 0 ? L"-" : L"+");
143     }
144     else
145     {
146         pwstSign = (_TVal < 0 ? L"-" : L" ");
147     }
148
149     if (bPrintOne == true || _TVal != 1)
150     {
151         unsigned long long a = _abs64(_TVal);
152         os_swprintf(pwstFormat, 32, L" %ls%llu", pwstSign, a);
153         os_swprintf(pwstOutput, 32, L"%*ls", _iWidth + 1, pwstFormat);//+1 for blank
154         *_postr << pwstOutput;
155     }
156 }
157
158
159 #endif /* __TOSTRING_COMMON_HXX__ */