00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00020 #ifndef flc_format_H
00021 #define flc_format_H
00022
00023 #include <falcon/setup.h>
00024 #include <falcon/types.h>
00025 #include <falcon/string.h>
00026 #include <falcon/falcondata.h>
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 namespace Falcon {
00046
00047 class VMachine;
00048 class Item;
00049
00050
00053 class Format: public FalconData
00054 {
00055
00056 public:
00057
00059 typedef enum {
00061 e_minusFront,
00063 e_plusMinusFront,
00065 e_minusBack,
00067 e_plusMinusBack,
00069 e_minusEnd,
00071 e_plusMinusEnd,
00073 e_parenthesis,
00075 e_parpad
00076 } t_negFormat;
00077
00079 typedef enum {
00081 e_decimal,
00083 e_binary,
00085 e_binaryB,
00087 e_octal,
00089 e_octalZero,
00091 e_hexLower,
00093 e_hexUpper,
00095 e_cHexLower,
00097 e_cHexUpper,
00099 e_scientific
00100 } t_numFormat;
00101
00103 typedef enum {
00105 e_tNum,
00107 e_tStr,
00109 e_tError
00110 }
00111 t_convType;
00112
00114 typedef enum {
00117 e_actNoAction,
00119 e_actNil,
00121 e_actZero,
00123 e_actRaise,
00125 e_actConvertNil,
00127 e_actConvertZero,
00129 e_actConvertRaise
00130 }
00131 t_convMismatch;
00132
00134 typedef enum {
00136 e_nilEmpty,
00138 e_nilNil,
00140 e_nilN,
00142 e_nilnil,
00144 e_nilNA,
00146 e_nilNone,
00148 e_nilNULL,
00150 e_nilNull,
00152 e_nilPad
00153 }
00154 t_nilFormat;
00155
00156
00157 private:
00158 t_convType m_convType;
00159 t_convMismatch m_misAct;
00160 uint16 m_size;
00161
00162 uint32 m_paddingChr;
00163 uint32 m_thousandSep;
00164 uint32 m_decimalSep;
00165
00166 uint8 m_grouping;
00167 bool m_fixedSize;
00168 t_nilFormat m_nilFormat;
00169
00170 bool m_rightAlign;
00171 uint8 m_decimals;
00172 t_negFormat m_negFormat;
00173 t_numFormat m_numFormat;
00174
00175 String m_originalFormat;
00176 uint32 m_posOfObjectFmt;
00177
00178 void formatInt( int64 number, String &target, bool bUseGroup );
00179 void applyNeg( String &target, int64 number );
00180 void applyPad( String &target, uint32 extraSize=0 );
00181
00183 int negPadSize( int64 number );
00184
00186 bool negBeforePad();
00187
00189 bool processMismatch( VMachine *vm, const Item &source, String &target );
00190
00192 bool tryConvertAndFormat( VMachine *vm, const Item &source, String &target );
00193
00195 void formatScientific( numeric num, String &sBuffer );
00196
00197 public:
00198
00199 Format() {
00200 reset();
00201 }
00202
00203 Format( const String &fmt )
00204 {
00205 reset();
00206 parse( fmt );
00207 }
00208
00209
00341 bool parse( const String &fmt );
00342
00344 bool isValid() const { return m_convType != e_tError; }
00345
00346
00359 bool format( const Item &source, String &target ) {
00360 return format( 0, source, target );
00361 }
00362
00378 bool format( VMachine *vm, const Item &source, String &target );
00379
00381 void reset();
00382
00383
00384
00385
00386
00387 const String &originalFormat() const { return m_originalFormat; }
00388
00389 t_convType convType() const { return m_convType; }
00390
00391 t_convMismatch mismatchAction() const { return m_misAct; }
00392 void mismatchAction( t_convMismatch t ) { m_misAct = t; }
00393
00394 uint16 fieldSize() const { return m_size; }
00395 void fieldSize( uint16 size ) { m_size = size; }
00396
00397 uint32 paddingChr() const { return m_paddingChr; }
00398 void paddingChr( uint32 chr ) { m_paddingChr = chr; }
00399
00400 bool rightAlign() const { return m_rightAlign; }
00401 void rightAlign( bool b ) { m_rightAlign = b; }
00402
00403 uint8 decimals() const { return m_decimals; }
00404 void decimals( uint8 d ) { m_decimals = d; }
00405
00406 uint8 grouping() const { return m_grouping; }
00407 void grouping( uint8 g ) { m_grouping = g; }
00408
00409 t_negFormat negFormat() const { return m_negFormat; }
00410 void negFormat( t_negFormat f ) { m_negFormat = f; }
00411
00412 t_nilFormat nilFormat() const { return m_nilFormat; }
00413 void nilFormat( t_nilFormat f ) { m_nilFormat = f; }
00414
00415 t_numFormat numFormat() const { return m_numFormat; }
00416 void numFormat( t_numFormat t ) { m_numFormat = t; }
00417
00418 bool fixedSize() const { return m_fixedSize; }
00419 void fixedSize( bool f ) { m_fixedSize = f; }
00420
00421
00422
00423 virtual FalconData *clone() const;
00424 virtual void gcMark( uint32 mark ) {}
00425 };
00426
00427 }
00428
00429 #endif
00430
00431