display of some types and lines function fixed.
[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  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef __TOSTRING_COMMON_HXX__
14 #define __TOSTRING_COMMON_HXX__
15
16 #include <sstream>
17 #include "os_swprintf.h"
18 #include "dynlib_ast.h"
19
20 #define SIZE_BETWEEN_TWO_VALUES         1
21 #define SPACE_BETWEEN_TWO_VALUES        L" "
22 #define SIZE_BOOL                       1
23 #define SIZE_BETWEEN_BOOL               1
24 #define SPACE_BETWEEN_BOOL              L" "
25 #define SIGN_LENGTH                     1
26 #define NO_SIGN                         L" "
27 #define MINUS_STRING                    L"-"
28 #define PLUS_STRING                     L"+"
29 #define SYMBOL_I                        L"i"
30
31
32 #define MAX_LINES                       100
33 #ifndef _MSC_VER
34 #include <inttypes.h>
35 #define _abs64(x) llabs(x)
36 #endif
37
38 typedef struct __DOUBLE_FORMAT__
39 {
40     __DOUBLE_FORMAT__() : iWidth(0), iPrec(0), bExp(false), bPrintPoint(true), bPrintPlusSign(false), bPrintOne(true), bPaddSign(true), iSignLen(SIGN_LENGTH), bPrintBlank(true) {}
41     int iWidth;
42     int iPrec;
43     bool bExp;
44     bool bPrintPoint;
45     bool bPrintPlusSign;
46     bool bPrintOne;
47     bool bPaddSign;
48     int iSignLen;
49     bool bPrintBlank;
50 } DoubleFormat;
51
52 /*double*/
53 //void getDoubleFormat(double _dblVal, int *_piWidth, int *_piPrec, bool* _pExp);
54 EXTERN_AST void getDoubleFormat(double _dblVal, DoubleFormat* _pDF);
55 //void getComplexFormat(double _dblR, double _dblI, int *_piTotalWidth, int *_piWidthR, int *_piWidthI, int *_piPrecR, int *_piPrecI, bool* _pExpR, bool* _pExpI);
56 EXTERN_AST void getComplexFormat(double _dblR, double _dblI, int *_piTotalWidth, DoubleFormat* _pDFR, DoubleFormat* _pDFI);
57
58 //addDoubleValue(int _iWidth, int _iPrec, bool _bExp, bool _bPrintPoint = true, bool _bPrintPlusSign = false, bool _bPrintOne = true, bool _bPaddSign = true, int _iSignLen = 2);
59 EXTERN_AST void addDoubleValue(std::wostringstream *_postr, double _dblVal, DoubleFormat* _pDF);
60 EXTERN_AST void addDoubleComplexValue(std::wostringstream *_postr, double _dblR, double _dblI, int _iTotalLen, DoubleFormat* _pDFR, DoubleFormat* _pDFI);
61
62 /*Common*/
63 EXTERN_AST void configureStream(std::wostringstream *_postr, int _iWidth, int _iPrec, char _cFill);
64 EXTERN_AST void addSpaces(std::wostringstream *_postr, int _iSpace);
65 void addColumnString(std::wostringstream& ostr, int _iFrom, int _iTo);
66
67 /*int*/
68 /*
69   We will specify all "signed" / "unsigned" cases to avoid Compilation Warning
70 */
71
72 template <typename T>
73 void getUnsignedIntFormat(T _TVal, int *_piWidth)
74 {
75     if (_TVal == 0)
76     {
77         *_piWidth = 0;
78     }
79     else
80     {
81         *_piWidth = static_cast<int>(log10(static_cast<long double>(_TVal)) + 1);
82     }
83     *_piWidth += 1;
84 }
85
86 template <typename T>
87 void getSignedIntFormat(T _TVal, int *_piWidth)
88 {
89     if (_TVal == 0)
90     {
91         *_piWidth = 0;
92     }
93     else
94     {
95         *_piWidth = static_cast<int>(log10(static_cast<long double>(_abs64(_TVal))) + 1);
96     }
97     *_piWidth += 1;
98 }
99
100 template <typename T>
101 void addUnsignedIntValue(std::wostringstream *_postr, T _TVal, int _iWidth, bool bPrintPlusSign = false, bool bPrintOne = true)
102 {
103     const wchar_t * pwstSign = PLUS_STRING;
104     wchar_t pwstFormat[32];
105     wchar_t pwstOutput[32];
106     if (bPrintPlusSign == true)
107     {
108         pwstSign = PLUS_STRING;
109     }
110     else
111     {
112         pwstSign = NO_SIGN;
113     }
114
115     if (bPrintOne == true || _TVal != 1)
116     {
117         os_swprintf(pwstFormat, 32, L" %ls%llu", pwstSign, (unsigned long long)(_TVal));
118         os_swprintf(pwstOutput, 32, L"%*ls", _iWidth + 1, pwstFormat);//+1 for blank
119         *_postr << pwstOutput;
120     }
121 }
122
123 template <typename T>
124 void addSignedIntValue(std::wostringstream *_postr, T _TVal, int _iWidth, bool bPrintPlusSign = false, bool bPrintOne = true)
125 {
126     const wchar_t* pwstSign = NULL;
127     wchar_t pwstFormat[32];
128     wchar_t pwstOutput[32];
129     if (bPrintPlusSign == true)
130     {
131         pwstSign = (_TVal < 0 ? L"-" : L"+");
132     }
133     else
134     {
135         pwstSign = (_TVal < 0 ? L"-" : L" ");
136     }
137
138     if (bPrintOne == true || _TVal != 1)
139     {
140         os_swprintf(pwstFormat, 32, L" %ls%lld", pwstSign, (long long)_abs64(_TVal));
141         os_swprintf(pwstOutput, 32, L"%*ls", _iWidth + 1, pwstFormat);//+1 for blank
142         *_postr << pwstOutput;
143     }
144 }
145
146
147 #endif /* __TOSTRING_COMMON_HXX__ */