/** * octalFormat. * @param td tag data container * @return formatted string */ static char * octalFormat(rpmtd td) { return numFormat(td, "%o"); }
/** * hexFormat. * @param td tag data container * @return formatted string */ static char * hexFormat(rpmtd td) { return numFormat(td, "%x"); }
bool Format::parse( const String &fmt ) { String tmp; uint32 pos = 0; uint32 len = fmt.length(); typedef enum { e_sInitial, e_sSize, e_sDecimals, e_sPadding, e_sDecSep, e_sGroupSep, e_sGroupSep2, e_sErrorEffect, e_sErrorEffect2, e_sNilMode, e_sNegFmt, e_sNegFmt2 } t_state; t_state state = e_sInitial; while( pos < len ) { uint32 chr = fmt.getCharAt( pos ); switch( state ) { //============================= // Basic state. // case e_sInitial: if( chr >= '0' && chr <= '9' ) { // size already given if ( m_size != 0 ) return false; state = e_sSize; tmp.size(0); tmp += chr; break; } // else: switch( chr ) { case 'N': // it should be an octal. m_convType = e_tNum; numFormat( e_decimal ); break; case '.': // it should be an octal. m_convType = e_tNum; state = e_sDecimals; tmp.size(0); break; case 'b': // it should be an octal. m_convType = e_tNum; numFormat( e_binary ); break; case 'B': // it should be an octal. m_convType = e_tNum; numFormat( e_binaryB ); break; case 'd': m_convType = e_tNum; state = e_sDecSep; break; case 'p': state = e_sPadding; break; case 'g': m_convType = e_tNum; state = e_sGroupSep; break; case 'G': m_convType = e_tNum; state = e_sGroupSep2; break; case '0': // it should be an octal. m_convType = e_tNum; numFormat( e_octalZero ); break; case 'o': // it should be an octal. m_convType = e_tNum; numFormat( e_octal ); break; case 'x': // it should be an octal. m_convType = e_tNum; numFormat( e_hexLower ); break; case 'X': // it should be an octal. m_convType = e_tNum; numFormat( e_hexUpper ); break; case 'c': // it should be an octal. m_convType = e_tNum; numFormat( e_cHexLower ); break; case 'C': // it should be an octal. m_convType = e_tNum; numFormat( e_cHexUpper ); break; case 'e': // it should be in scientific format m_convType = e_tNum; numFormat( e_scientific ); break; case '/': // it should be an octal. state = e_sErrorEffect; break; case 'n': state = e_sNilMode; break; case '|': m_posOfObjectFmt = pos; m_convType = e_tStr; // complete parsing pos = len; break; case '+': m_negFormat = e_plusMinusFront; state = e_sNegFmt; break; case '-': m_negFormat = e_minusFront; state = e_sNegFmt2; break; case '[': m_negFormat = e_parenthesis; break; case ']': m_negFormat = e_parpad; break; case 'r': m_rightAlign = true; break; default: // unrecognized character m_convType = e_tError; return false; } break; //============================= // Parse padding // case e_sDecSep: m_decimalSep = chr; state = e_sInitial; break; case e_sPadding: m_paddingChr = chr; state = e_sInitial; break; case e_sGroupSep: if( chr >= '0' && chr <='9' ) { m_grouping = chr - '0'; state = e_sGroupSep2; } else { m_thousandSep = chr; state = e_sInitial; } break; case e_sGroupSep2: m_thousandSep = chr; state = e_sInitial; break; //============================= // Size parsing state // case e_sSize: if( chr >= '0' && chr <= '9' ) { tmp += chr; // size too wide if ( tmp.length() > 4 ) { m_convType = e_tError; return false; } } else { int64 tgt; tmp.parseInt( tgt ); fieldSize( (uint16) tgt ); if( chr == '*' ) { fixedSize( true ); } else { // reparse current char --pos; } state = e_sInitial; } break; //============================= // Decimals parsing state // case e_sDecimals: if( chr >= '0' && chr <= '9' ) { tmp += chr; // size too wide if ( tmp.length() > 2 ) { m_convType = e_tError; return false; } } else { int64 tgt; tmp.parseInt( tgt ); decimals( (uint8) tgt ); // reparse current char --pos; state = e_sInitial; } break; //=============================================== // Parsing what should be done in case of error. // case e_sErrorEffect: if ( chr == 'c' ) { state = e_sErrorEffect2; break; } // else switch( chr ) { case 'n': mismatchAction( e_actNil ); break; case '0': mismatchAction( e_actZero ); break; case 'r': mismatchAction( e_actRaise ); break; default: // invalid choiche m_convType = e_tError; return false; } state = e_sInitial; break; case e_sErrorEffect2: switch( chr ) { case 'n': mismatchAction( e_actConvertNil ); break; case '0': mismatchAction( e_actConvertZero ); break; case 'r': mismatchAction( e_actConvertRaise ); break; default: // invalid choiche m_convType = e_tError; return false; } state = e_sInitial; break; //================================= // parsing what do to with a Nil // case e_sNilMode: switch( chr ) { case 'n': m_nilFormat = e_nilEmpty; break; case 'N': m_nilFormat = e_nilN; break; case 'l': m_nilFormat = e_nilnil; break; case 'L': m_nilFormat = e_nilNil; break; case 'u': m_nilFormat = e_nilNull; break; case 'U': m_nilFormat = e_nilNULL; break; case 'o': m_nilFormat = e_nilNone; break; case 'A': m_nilFormat = e_nilNA; break; default: m_convType = e_tError; return false; } state = e_sInitial; break; //================================= // Parsing neg format case e_sNegFmt: switch( chr ) { case '+': m_negFormat = e_plusMinusBack; break; case '^': m_negFormat = e_plusMinusEnd; break; default: pos--; } state = e_sInitial; break; //================================= // Parsing neg format 2 case e_sNegFmt2: switch( chr ) { case '-': m_negFormat = e_minusBack; break; case '^': m_negFormat = e_minusEnd; break; default: pos--; } state = e_sInitial; break; } ++pos; } // end main loop // verify output status switch( state ) { case e_sInitial: // ok case e_sNegFmt: break; case e_sSize: { int64 tgt; tmp.parseInt( tgt ); fieldSize( (uint8) tgt ); } break; case e_sDecimals: { int64 tgt; tmp.parseInt( tgt ); decimals( (uint8) tgt ); } break; // any other state means we're left in the middle of something default: m_convType = e_tError; return false; } // if everything goes fine... m_originalFormat = fmt; return true; }