09fac762c0ba94a219a5cbfef89e0fa4ce71743d
[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
66 /*int*/
67 /*
68   We will specify all "signed" / "unsigned" cases to avoid Compilation Warning
69 */
70
71 template <typename T>
72 void getUnsignedIntFormat(T _TVal, int *_piWidth)
73 {
74     if (_TVal == 0)
75     {
76         *_piWidth = 0;
77     }
78     else
79     {
80         *_piWidth = static_cast<int>(log10(static_cast<long double>(_TVal)) + 1);
81     }
82     *_piWidth += 1;
83 }
84
85 template <typename T>
86 void getSignedIntFormat(T _TVal, int *_piWidth)
87 {
88     if (_TVal == 0)
89     {
90         *_piWidth = 0;
91     }
92     else
93     {
94         *_piWidth = static_cast<int>(log10(static_cast<long double>(_abs64(_TVal))) + 1);
95     }
96     *_piWidth += 1;
97 }
98
99 template <typename T>
100 void addUnsignedIntValue(std::wostringstream *_postr, T _TVal, int _iWidth, bool bPrintPlusSign = false, bool bPrintOne = true)
101 {
102     const wchar_t * pwstSign = PLUS_STRING;
103     wchar_t pwstFormat[32];
104     wchar_t pwstOutput[32];
105     if (bPrintPlusSign == true)
106     {
107         pwstSign = PLUS_STRING;
108     }
109     else
110     {
111         pwstSign = NO_SIGN;
112     }
113
114     if (bPrintOne == true || _TVal != 1)
115     {
116         os_swprintf(pwstFormat, 32, L" %ls%llu", pwstSign, (unsigned long long)(_TVal));
117         os_swprintf(pwstOutput, 32, L"%*ls", _iWidth + 1, pwstFormat);//+1 for blank
118         *_postr << pwstOutput;
119     }
120 }
121
122 template <typename T>
123 void addSignedIntValue(std::wostringstream *_postr, T _TVal, int _iWidth, bool bPrintPlusSign = false, bool bPrintOne = true)
124 {
125     const wchar_t* pwstSign = NULL;
126     wchar_t pwstFormat[32];
127     wchar_t pwstOutput[32];
128     if (bPrintPlusSign == true)
129     {
130         pwstSign = (_TVal < 0 ? L"-" : L"+");
131     }
132     else
133     {
134         pwstSign = (_TVal < 0 ? L"-" : L" ");
135     }
136
137     if (bPrintOne == true || _TVal != 1)
138     {
139         os_swprintf(pwstFormat, 32, L" %ls%lld", pwstSign, (long long)_abs64(_TVal));
140         os_swprintf(pwstOutput, 32, L"%*ls", _iWidth + 1, pwstFormat);//+1 for blank
141         *_postr << pwstOutput;
142     }
143 }
144
145
146 #endif /* __TOSTRING_COMMON_HXX__ */