1*12720SWyllys.Ingersoll@Sun.COM /* 2*12720SWyllys.Ingersoll@Sun.COM * CDDL HEADER START 3*12720SWyllys.Ingersoll@Sun.COM * 4*12720SWyllys.Ingersoll@Sun.COM * The contents of this file are subject to the terms of the 5*12720SWyllys.Ingersoll@Sun.COM * Common Development and Distribution License (the "License"). 6*12720SWyllys.Ingersoll@Sun.COM * You may not use this file except in compliance with the License. 7*12720SWyllys.Ingersoll@Sun.COM * 8*12720SWyllys.Ingersoll@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*12720SWyllys.Ingersoll@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*12720SWyllys.Ingersoll@Sun.COM * See the License for the specific language governing permissions 11*12720SWyllys.Ingersoll@Sun.COM * and limitations under the License. 12*12720SWyllys.Ingersoll@Sun.COM * 13*12720SWyllys.Ingersoll@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*12720SWyllys.Ingersoll@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*12720SWyllys.Ingersoll@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*12720SWyllys.Ingersoll@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*12720SWyllys.Ingersoll@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*12720SWyllys.Ingersoll@Sun.COM * 19*12720SWyllys.Ingersoll@Sun.COM * CDDL HEADER END 20*12720SWyllys.Ingersoll@Sun.COM */ 21*12720SWyllys.Ingersoll@Sun.COM 22*12720SWyllys.Ingersoll@Sun.COM /* 23*12720SWyllys.Ingersoll@Sun.COM * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 24*12720SWyllys.Ingersoll@Sun.COM */ 25*12720SWyllys.Ingersoll@Sun.COM 26*12720SWyllys.Ingersoll@Sun.COM #ifndef WIN32 27*12720SWyllys.Ingersoll@Sun.COM #include <ctype.h> 28*12720SWyllys.Ingersoll@Sun.COM 29*12720SWyllys.Ingersoll@Sun.COM #ifndef METAWARE 30*12720SWyllys.Ingersoll@Sun.COM #include <wctype.h> 31*12720SWyllys.Ingersoll@Sun.COM #endif 32*12720SWyllys.Ingersoll@Sun.COM 33*12720SWyllys.Ingersoll@Sun.COM #endif 34*12720SWyllys.Ingersoll@Sun.COM 35*12720SWyllys.Ingersoll@Sun.COM #ifndef METAWARE 36*12720SWyllys.Ingersoll@Sun.COM #include <sys/timeb.h> 37*12720SWyllys.Ingersoll@Sun.COM #endif 38*12720SWyllys.Ingersoll@Sun.COM 39*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgentStringUtilities.h" 40*12720SWyllys.Ingersoll@Sun.COM 41*12720SWyllys.Ingersoll@Sun.COM #ifdef WIN32 42*12720SWyllys.Ingersoll@Sun.COM #include <stdlib.h> 43*12720SWyllys.Ingersoll@Sun.COM #include <time.h> 44*12720SWyllys.Ingersoll@Sun.COM #define gmtime_r(clock,result) ( *(result) = *gmtime(clock), result ) 45*12720SWyllys.Ingersoll@Sun.COM #endif 46*12720SWyllys.Ingersoll@Sun.COM 47*12720SWyllys.Ingersoll@Sun.COM // Find header in KMSAgentStringUtilities.h 48*12720SWyllys.Ingersoll@Sun.COM int64 UTF8ToInt64( const char* i_sNumber ) 49*12720SWyllys.Ingersoll@Sun.COM { 50*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( i_sNumber ); 51*12720SWyllys.Ingersoll@Sun.COM 52*12720SWyllys.Ingersoll@Sun.COM #ifdef WIN32 53*12720SWyllys.Ingersoll@Sun.COM return _atoi64( i_sNumber ); 54*12720SWyllys.Ingersoll@Sun.COM #else 55*12720SWyllys.Ingersoll@Sun.COM return atoll( i_sNumber ); 56*12720SWyllys.Ingersoll@Sun.COM #endif 57*12720SWyllys.Ingersoll@Sun.COM } 58*12720SWyllys.Ingersoll@Sun.COM 59*12720SWyllys.Ingersoll@Sun.COM void Int64ToUTF8(char* const o_psUTF8, 60*12720SWyllys.Ingersoll@Sun.COM int64 i_iNumber, 61*12720SWyllys.Ingersoll@Sun.COM int i_bPad, 62*12720SWyllys.Ingersoll@Sun.COM int i_bHex ) 63*12720SWyllys.Ingersoll@Sun.COM { 64*12720SWyllys.Ingersoll@Sun.COM //string sFormat; 65*12720SWyllys.Ingersoll@Sun.COM char sFormat[10]; 66*12720SWyllys.Ingersoll@Sun.COM 67*12720SWyllys.Ingersoll@Sun.COM if ( i_bPad && i_bHex ) 68*12720SWyllys.Ingersoll@Sun.COM { 69*12720SWyllys.Ingersoll@Sun.COM #ifdef WIN32 70*12720SWyllys.Ingersoll@Sun.COM strcpy(sFormat,"%016I64X"); 71*12720SWyllys.Ingersoll@Sun.COM #else 72*12720SWyllys.Ingersoll@Sun.COM strcpy(sFormat,"%016llX"); 73*12720SWyllys.Ingersoll@Sun.COM #endif 74*12720SWyllys.Ingersoll@Sun.COM } 75*12720SWyllys.Ingersoll@Sun.COM else if ( i_bPad && !i_bHex ) 76*12720SWyllys.Ingersoll@Sun.COM { 77*12720SWyllys.Ingersoll@Sun.COM #ifdef WIN32 78*12720SWyllys.Ingersoll@Sun.COM strcpy(sFormat, "%019I64d"); 79*12720SWyllys.Ingersoll@Sun.COM #else 80*12720SWyllys.Ingersoll@Sun.COM strcpy(sFormat, "%019lld"); 81*12720SWyllys.Ingersoll@Sun.COM #endif 82*12720SWyllys.Ingersoll@Sun.COM } 83*12720SWyllys.Ingersoll@Sun.COM else if ( !i_bPad && i_bHex ) 84*12720SWyllys.Ingersoll@Sun.COM { 85*12720SWyllys.Ingersoll@Sun.COM #ifdef WIN32 86*12720SWyllys.Ingersoll@Sun.COM strcpy(sFormat, "%I64X"); 87*12720SWyllys.Ingersoll@Sun.COM #else 88*12720SWyllys.Ingersoll@Sun.COM strcpy(sFormat, "%llX"); 89*12720SWyllys.Ingersoll@Sun.COM #endif 90*12720SWyllys.Ingersoll@Sun.COM } 91*12720SWyllys.Ingersoll@Sun.COM else //( !i_bPad && !i_bHex ) 92*12720SWyllys.Ingersoll@Sun.COM { 93*12720SWyllys.Ingersoll@Sun.COM #ifdef WIN32 94*12720SWyllys.Ingersoll@Sun.COM strcpy(sFormat, "%I64d"); 95*12720SWyllys.Ingersoll@Sun.COM #else 96*12720SWyllys.Ingersoll@Sun.COM strcpy(sFormat, "%lld"); 97*12720SWyllys.Ingersoll@Sun.COM #endif 98*12720SWyllys.Ingersoll@Sun.COM } 99*12720SWyllys.Ingersoll@Sun.COM 100*12720SWyllys.Ingersoll@Sun.COM #ifndef METAWARE 101*12720SWyllys.Ingersoll@Sun.COM int iReturn = sprintf( o_psUTF8, sFormat, i_iNumber); 102*12720SWyllys.Ingersoll@Sun.COM 103*12720SWyllys.Ingersoll@Sun.COM //int iReturn = K_snprintf(o_psUTF8, iBufferSize, sFormat, i_iNumber); 104*12720SWyllys.Ingersoll@Sun.COM #else 105*12720SWyllys.Ingersoll@Sun.COM int iReturn = sprintf( o_psUTF8, sFormat, i_iNumber); 106*12720SWyllys.Ingersoll@Sun.COM #endif 107*12720SWyllys.Ingersoll@Sun.COM if ( iReturn < 0 ) 108*12720SWyllys.Ingersoll@Sun.COM { 109*12720SWyllys.Ingersoll@Sun.COM // Our buffer wasn't big enough. Shouldn't happen. 110*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT(0); 111*12720SWyllys.Ingersoll@Sun.COM } 112*12720SWyllys.Ingersoll@Sun.COM 113*12720SWyllys.Ingersoll@Sun.COM return; 114*12720SWyllys.Ingersoll@Sun.COM 115*12720SWyllys.Ingersoll@Sun.COM } 116*12720SWyllys.Ingersoll@Sun.COM 117*12720SWyllys.Ingersoll@Sun.COM // Find header in KMSAgentStringUtilities.h 118*12720SWyllys.Ingersoll@Sun.COM int ConvertUTF8HexStringToBinary( 119*12720SWyllys.Ingersoll@Sun.COM const char* i_sHexString, 120*12720SWyllys.Ingersoll@Sun.COM unsigned char* o_pBinaryBuffer) 121*12720SWyllys.Ingersoll@Sun.COM { 122*12720SWyllys.Ingersoll@Sun.COM int iHexLen = i_sHexString ? strlen(i_sHexString) : 0; 123*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( (iHexLen % 2) == 0 ); // to be valid, the hex string must have an even number of characters 124*12720SWyllys.Ingersoll@Sun.COM 125*12720SWyllys.Ingersoll@Sun.COM if ( !o_pBinaryBuffer ) 126*12720SWyllys.Ingersoll@Sun.COM { 127*12720SWyllys.Ingersoll@Sun.COM return ( iHexLen / 2 ); 128*12720SWyllys.Ingersoll@Sun.COM } 129*12720SWyllys.Ingersoll@Sun.COM 130*12720SWyllys.Ingersoll@Sun.COM if ( iHexLen <= 0 ) 131*12720SWyllys.Ingersoll@Sun.COM { 132*12720SWyllys.Ingersoll@Sun.COM return 0; 133*12720SWyllys.Ingersoll@Sun.COM } 134*12720SWyllys.Ingersoll@Sun.COM 135*12720SWyllys.Ingersoll@Sun.COM int iDigitValue = 0; 136*12720SWyllys.Ingersoll@Sun.COM 137*12720SWyllys.Ingersoll@Sun.COM for ( int i = 0; i < iHexLen; i++) 138*12720SWyllys.Ingersoll@Sun.COM { 139*12720SWyllys.Ingersoll@Sun.COM if (i_sHexString[i] >= '0' && i_sHexString[i] <= '9') 140*12720SWyllys.Ingersoll@Sun.COM { 141*12720SWyllys.Ingersoll@Sun.COM iDigitValue = i_sHexString[i] - '0'; 142*12720SWyllys.Ingersoll@Sun.COM } 143*12720SWyllys.Ingersoll@Sun.COM else if (i_sHexString[i] >= 'A' && i_sHexString[i] <= 'F') 144*12720SWyllys.Ingersoll@Sun.COM { 145*12720SWyllys.Ingersoll@Sun.COM iDigitValue = i_sHexString[i] - 'A' + 10; 146*12720SWyllys.Ingersoll@Sun.COM } 147*12720SWyllys.Ingersoll@Sun.COM else if (i_sHexString[i] >= 'a' && i_sHexString[i] <= 'f') 148*12720SWyllys.Ingersoll@Sun.COM { 149*12720SWyllys.Ingersoll@Sun.COM iDigitValue = i_sHexString[i] - 'a' + 10; 150*12720SWyllys.Ingersoll@Sun.COM } 151*12720SWyllys.Ingersoll@Sun.COM else 152*12720SWyllys.Ingersoll@Sun.COM { 153*12720SWyllys.Ingersoll@Sun.COM iDigitValue = 0; 154*12720SWyllys.Ingersoll@Sun.COM } 155*12720SWyllys.Ingersoll@Sun.COM 156*12720SWyllys.Ingersoll@Sun.COM if (i % 2 == 0) 157*12720SWyllys.Ingersoll@Sun.COM { 158*12720SWyllys.Ingersoll@Sun.COM o_pBinaryBuffer[i/2] = (char)(iDigitValue << 4); 159*12720SWyllys.Ingersoll@Sun.COM } 160*12720SWyllys.Ingersoll@Sun.COM else 161*12720SWyllys.Ingersoll@Sun.COM { 162*12720SWyllys.Ingersoll@Sun.COM o_pBinaryBuffer[i/2] |= (char)iDigitValue; 163*12720SWyllys.Ingersoll@Sun.COM } 164*12720SWyllys.Ingersoll@Sun.COM } 165*12720SWyllys.Ingersoll@Sun.COM 166*12720SWyllys.Ingersoll@Sun.COM return ( iHexLen / 2 ); 167*12720SWyllys.Ingersoll@Sun.COM } 168*12720SWyllys.Ingersoll@Sun.COM 169*12720SWyllys.Ingersoll@Sun.COM // Find header in KMSAgentStringUtilities.h 170*12720SWyllys.Ingersoll@Sun.COM void ConvertBinaryToUTF8HexString( 171*12720SWyllys.Ingersoll@Sun.COM char* const o_sHexString, 172*12720SWyllys.Ingersoll@Sun.COM const unsigned char* const i_pBinaryBuffer, 173*12720SWyllys.Ingersoll@Sun.COM int i_iBinaryBufferSize ) 174*12720SWyllys.Ingersoll@Sun.COM { 175*12720SWyllys.Ingersoll@Sun.COM const char HEXCHARS[] = "0123456789ABCDEF"; 176*12720SWyllys.Ingersoll@Sun.COM 177*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( o_sHexString ); 178*12720SWyllys.Ingersoll@Sun.COM 179*12720SWyllys.Ingersoll@Sun.COM if ( (i_pBinaryBuffer == 0) || (i_iBinaryBufferSize == 0) ) 180*12720SWyllys.Ingersoll@Sun.COM { 181*12720SWyllys.Ingersoll@Sun.COM strcpy(o_sHexString, ""); 182*12720SWyllys.Ingersoll@Sun.COM return; 183*12720SWyllys.Ingersoll@Sun.COM } 184*12720SWyllys.Ingersoll@Sun.COM 185*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( i_pBinaryBuffer ); 186*12720SWyllys.Ingersoll@Sun.COM 187*12720SWyllys.Ingersoll@Sun.COM for ( int i = 0; i < (2 * i_iBinaryBufferSize); i++ ) 188*12720SWyllys.Ingersoll@Sun.COM { 189*12720SWyllys.Ingersoll@Sun.COM unsigned char ucFourBits = i_pBinaryBuffer[i / 2]; 190*12720SWyllys.Ingersoll@Sun.COM if ( (i % 2) == 0 ) // high four bits of the current byte 191*12720SWyllys.Ingersoll@Sun.COM ucFourBits = (ucFourBits >> 4) & 0xF; // shift down and blank out upper bits 192*12720SWyllys.Ingersoll@Sun.COM else // low four bits of the current byte 193*12720SWyllys.Ingersoll@Sun.COM ucFourBits = ucFourBits & 0xF; // blank out upper bits 194*12720SWyllys.Ingersoll@Sun.COM 195*12720SWyllys.Ingersoll@Sun.COM o_sHexString[i] = HEXCHARS[ucFourBits]; 196*12720SWyllys.Ingersoll@Sun.COM } 197*12720SWyllys.Ingersoll@Sun.COM 198*12720SWyllys.Ingersoll@Sun.COM o_sHexString[i_iBinaryBufferSize * 2] = '\0'; 199*12720SWyllys.Ingersoll@Sun.COM 200*12720SWyllys.Ingersoll@Sun.COM return; 201*12720SWyllys.Ingersoll@Sun.COM } 202*12720SWyllys.Ingersoll@Sun.COM 203*12720SWyllys.Ingersoll@Sun.COM 204*12720SWyllys.Ingersoll@Sun.COM // Find header in StringUtilities.h 205*12720SWyllys.Ingersoll@Sun.COM void GetCurrentDateTimeISO8601UTC(char* const o_psDateTimeISO8601UTC, 206*12720SWyllys.Ingersoll@Sun.COM int i_iLength) 207*12720SWyllys.Ingersoll@Sun.COM { 208*12720SWyllys.Ingersoll@Sun.COM 209*12720SWyllys.Ingersoll@Sun.COM #ifndef METAWARE 210*12720SWyllys.Ingersoll@Sun.COM timeb stTime; 211*12720SWyllys.Ingersoll@Sun.COM ftime(&stTime); 212*12720SWyllys.Ingersoll@Sun.COM 213*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( o_psDateTimeISO8601UTC ); 214*12720SWyllys.Ingersoll@Sun.COM 215*12720SWyllys.Ingersoll@Sun.COM struct tm* pstTime = gmtime( &(stTime.time) ); 216*12720SWyllys.Ingersoll@Sun.COM 217*12720SWyllys.Ingersoll@Sun.COM K_snprintf( 218*12720SWyllys.Ingersoll@Sun.COM o_psDateTimeISO8601UTC, 219*12720SWyllys.Ingersoll@Sun.COM i_iLength, 220*12720SWyllys.Ingersoll@Sun.COM "%04d-%02d-%02d %02d:%02d:%02d.%03dZ", 221*12720SWyllys.Ingersoll@Sun.COM pstTime->tm_year+1900, 222*12720SWyllys.Ingersoll@Sun.COM pstTime->tm_mon+1, 223*12720SWyllys.Ingersoll@Sun.COM pstTime->tm_mday, 224*12720SWyllys.Ingersoll@Sun.COM pstTime->tm_hour, 225*12720SWyllys.Ingersoll@Sun.COM pstTime->tm_min, 226*12720SWyllys.Ingersoll@Sun.COM pstTime->tm_sec, 227*12720SWyllys.Ingersoll@Sun.COM stTime.millitm); 228*12720SWyllys.Ingersoll@Sun.COM 229*12720SWyllys.Ingersoll@Sun.COM #else 230*12720SWyllys.Ingersoll@Sun.COM // no time functions for the metaware environment 231*12720SWyllys.Ingersoll@Sun.COM strcpy( o_psDateTimeISO8601UTC, "" ); 232*12720SWyllys.Ingersoll@Sun.COM #endif 233*12720SWyllys.Ingersoll@Sun.COM return; 234*12720SWyllys.Ingersoll@Sun.COM } 235*12720SWyllys.Ingersoll@Sun.COM 236