short Scanner::getToken( YYSTYPE & lval ) //--------------------------------------- // get the next token from the input stream. // at each call, the next character should be // in _current. { const int MaxBufLen = 512; char buffer[ MaxBufLen ]; int bufPos; // position in buffer char special; gobble(); if( isEOF() ) { return 0; } if( isSpecial() ) { special = (char) _current; get(); // set up for next call return special; // <-------- early return } if( isQuote() ) { readQuotedString( lval ); return T_String; // <-------- early return } if( _current == '0' ) { get(); if( toupper( _current ) == 'X' ) { readHex( lval ); } else { if( isDigit() ) { readDecimal( lval ); } else { lval = 0; } } return T_Number; // <-------- early return } if( isDigit() ) { readDecimal( lval ); return T_Number; // <-------- early return } for( bufPos = 0; bufPos < MaxBufLen; bufPos += 1 ) { buffer[ bufPos ] = (char) _current; get(); if( isEOF() || isSpace() || isSpecial() ) break; } bufPos += 1; assert( bufPos < MaxBufLen ); buffer[ bufPos ] = '\0'; return tokenValue( buffer, lval ); }
string psoCat::odbcFieldToStr( uint32_t length ) { psoFieldDefinition * fieldODBC; int numFields, i; string outStr; fieldODBC = (psoFieldDefinition *) fieldDef; numFields = fieldDefLength / sizeof(psoFieldDefinition); psoaGetFieldOffsets( fieldODBC, numFields, fieldOffsets ); for ( i = 0; i < numFields; ++i ) { string s; switch( fieldODBC[i].type ) { case PSO_TINYINT: s = readInt8( &buffer[fieldOffsets[i]] ); break; case PSO_SMALLINT: s = readInt16( &buffer[fieldOffsets[i]] ); break; case PSO_INTEGER: s = readInt32( &buffer[fieldOffsets[i]] ); break; case PSO_BIGINT: s = readInt64( &buffer[fieldOffsets[i]] ); break; case PSO_BINARY: readBinary( s, fieldODBC[i].vals.length, &buffer[fieldOffsets[i]] ); break; case PSO_CHAR: readString( s, fieldODBC[i].vals.length, &buffer[fieldOffsets[i]] ); break; case PSO_NUMERIC: s = readDecimal( fieldODBC[i].vals.decimal.precision, fieldODBC[i].vals.decimal.scale, &buffer[fieldOffsets[i]] ); break; case PSO_VARCHAR: case PSO_LONGVARCHAR: readString( s, length - fieldOffsets[i], &buffer[fieldOffsets[i]] ); break; case PSO_VARBINARY: case PSO_LONGVARBINARY: readBinary( s, length - fieldOffsets[i], &buffer[fieldOffsets[i]] ); break; case PSO_REAL: s = readFloat32( &buffer[fieldOffsets[i]] ); break; case PSO_DOUBLE: s = readFloat64( &buffer[fieldOffsets[i]] ); break; case PSO_DATE: s = readDate( &buffer[fieldOffsets[i]] ); break; case PSO_TIME: s = readTime( &buffer[fieldOffsets[i]] ); break; case PSO_TIMESTAMP: s = readTimeStamp( &buffer[fieldOffsets[i]] ); break; } outStr += s; if ( i < numFields-1) outStr += ", "; } return outStr; }