Example #1
0
__int64 strtoll(
     const char *nptr, 
     char **endptr, 
     int base)
{
    return _strtoi64(nptr, endptr, base);
}
Example #2
0
	vint64_t atoi64_test(const AString& string, bool& success)
	{
		char* endptr = 0;
		vint64_t result = _strtoi64(string.Buffer(), &endptr, 10);
		success = endptr == string.Buffer() + string.Length() && i64toa(result) == string;
		return result;
	}
Example #3
0
/*
 * Parse string as int64
 * valid range: -9223372036854775808 ~ 9223372036854775807
 */
bool
parse_int64(const char *value, int64 *result)
{
	int64	val;
	char   *endptr;

	if (strcmp(value, INFINITE_STR) == 0)
	{
		*result = LLONG_MAX;
		return true;
	}

	errno = 0;
#ifdef WIN32
	val = _strtoi64(value, &endptr, 0);
#elif defined(HAVE_LONG_INT_64)
	val = strtol(value, &endptr, 0);
#elif defined(HAVE_LONG_LONG_INT_64)
	val = strtoll(value, &endptr, 0);
#else
	val = strtol(value, &endptr, 0);
#endif
	if (endptr == value || *endptr)
		return false;

	if (errno == ERANGE)
		return false;

	*result = val;

	return true;
}
AREXPORT bool ArArgumentBuilder::isArgLongLongInt(size_t whichArg) const
{
  const char *str;
  long long int ret;
  char *endPtr;
  if (whichArg > myArgc || getArg(whichArg) == NULL)
    return false;

  int base = 10;
  str = getArg(whichArg);
  // see if its a hex number
  if (strlen(str) > 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
  {
    str = &str[2];
    base = 16;
  }

#ifndef _MSC_VER
    ret = strtoll(str, &endPtr, base);
#else
    ret = _strtoi64(str, &endPtr, base);
#endif

  if (endPtr[0] == '\0' && endPtr != str)
    return true;
  else
    return false;
}
Example #5
0
long long int strtoll(const char *nptr, char **endptr, int base) {
#ifdef WIN32
	return _strtoi64(nptr, endptr, base);
#else
	return strtol(nptr, endptr, base);
#endif
}
Example #6
0
void tool_lookup(const vdfastvector<const char *>& args, const vdfastvector<const char *>& switches, bool amd64) {
	if (args.size() < 2)
		help_lookup();

	char *s;
	sint64 addr = _strtoi64(args[1], &s, 16);

	if (*s)
		fail("lookup: invalid address \"%s\"", args[0]);

	vdautoptr<IVDSymbolSource> pss(VDCreateSymbolSourceLinkMap());

	pss->Init(VDTextAToW(args[0]).c_str());

	const VDSymbol *sym = pss->LookupSymbol(addr);

	if (!sym)
		fail("symbol not found for address %08x", addr);

	const char *fn;
	int line;

	if (pss->LookupLine(addr, fn, line))
		printf("%08I64x   %s + %x [%s:%d]\n", addr, sym->name, addr-sym->rva, fn, line);
	else
		printf("%08I64x   %s + %x\n", addr, sym->name, addr-sym->rva);
}
Example #7
0
    static long long str_to_int(const char* str) {
#ifdef _MSC_VER
        return _strtoi64(str, nullptr, 10);
#else
        return std::strtoll(str, nullptr, 10);
#endif
    }
Example #8
0
inline T str2number(const char *str, int base, bool safe)
{
  int errno_bak=errno;
  errno=0;
  char *endptr;
// _strtoi64 is available in Visual Studio, but not yet in MINGW
#ifdef _MSC_VER
  const __int64 val=_strtoi64(str, &endptr, base);
#else
  const long long val=strtoll(str, &endptr, base);
#endif

  if(safe)
  {
    CHECK_RETURN(0==errno);
    errno=errno_bak;
    CHECK_RETURN(endptr!=str);
    if(std::numeric_limits<T>::min()==0)
    {
      // unsigned
      CHECK_RETURN(val>=0);
      CHECK_RETURN(
        (unsigned long long)(T)val<=
        (unsigned long long)std::numeric_limits<T>::max());
    }
    else
    {
      // signed
      CHECK_RETURN(val<=(long long)std::numeric_limits<T>::max());
      CHECK_RETURN(val>=(long long)std::numeric_limits<T>::min());
    }
  }

  return (T)val;
}
Example #9
0
ev_int64_t
evutil_strtoll(const char *s, char **endptr, int base)
{
#ifdef HAVE_STRTOLL
	return (ev_int64_t)strtoll(s, endptr, base);
#elif SIZEOF_LONG == 8
	return (ev_int64_t)strtol(s, endptr, base);
#elif defined(WIN32) && defined(_MSC_VER) && _MSC_VER < 1300
	/* XXXX on old versions of MS APIs, we only support base
	 * 10. */
	ev_int64_t r;
	if (base != 10)
		return 0;
	r = (ev_int64_t) _atoi64(s);
	while (isspace(*s))
		++s;
	while (isdigit(*s))
		++s;
	if (endptr)
		*endptr = (char*) s;
	return r;
#elif defined(WIN32)
	return (ev_int64_t) _strtoi64(s, endptr, base);
#else
#error "I don't know how to parse 64-bit integers."
#endif
}
Example #10
0
// Presence/absense of strtoll and strtoull depends on the compiler rather than the target environment.   For instance, MinGW
// has strtoll and strtoull and lacks _strtoi64 and _strtoui64 even though both MinGW and MVC are targeting a Windows
// environment.
SAWYER_EXPORT boost::int64_t
strtoll(const char *input, char **rest, int base) {
#ifdef _MSC_VER
    return _strtoi64(input, rest, base);
#else
    return ::strtoll(input, rest, base);
#endif
}
Example #11
0
	/** The basic conversion operators */
	VerySimpleReadOnlyString::operator int64() const
	{
#ifdef _MSC_VER
        return (int64)_strtoi64(data, NULL, 10);
#else
	    return (int64)strtoll(data, NULL, 10);
#endif
	}
Example #12
0
	static inline long long hexStrTo64(const char *s)
		throw()
	{
#ifdef __WINDOWS__
		return (long long)_strtoi64(s,(char **)0,16);
#else
		return strtoll(s,(char **)0,16);
#endif
	}
Example #13
0
int64_t
VmKdcStringToLA(
   PCSTR nptr,
   PSTR* endptr,
   int base
)
{
    return _strtoi64( nptr, endptr, base );
}
Example #14
0
bool to_int64(char const * s, int64_t & i)
{
  char * stop;
#ifdef OMIM_OS_WINDOWS_NATIVE
  i = _strtoi64(s, &stop, 10);
#else
  i = strtoll(s, &stop, 10);
#endif
  return *stop == 0 && s != stop;
}
Example #15
0
time_t utils::time::from_string(const std::string &data)
{
	long long timestamp = _strtoi64(data.c_str(), NULL, 10);

	// If it is milli timestamp
	if (timestamp > 100000000000)
		timestamp /= 1000;

	// If conversion fails, use local time?
	//if (!timestamp)
	//	timestamp = ::time(NULL);

	return (time_t)timestamp;
}
Example #16
0
static bool parse_integer(const char * str, T& val)
{
	char * p;
	long long ll;
#ifdef WIN32
	ll = _strtoi64(str, &p, 10);
#else
	ll = strtol(str, &p, 10);
#endif
	if (p == str || (*p && ! isspace((unsigned char)*p)))
		return false;
	val = static_cast<T>(ll);
	return true;
}
Example #17
0
DWORD_PTR TreeImportExport::ConvertStringToDwordPtr(const char * strValue)
{
	DWORD_PTR result = 0;

	if (strValue)
	{
#ifdef _WIN64
		result = _strtoi64(strValue, NULL, 16);
#else
		result = strtoul(strValue, NULL, 16);
#endif
	}

	return result;
}
Int64
strToInt64(const char* s, char** endptr, int base)
{
#if defined(_WIN32)
#   ifdef __MINGW32__
    return strToInt64Impl(s, endptr, base);
#   else
    return _strtoi64(s, endptr, base);
#   endif
#elif defined(ICE_64)
    return strtol(s, endptr, base);
#elif defined(__hpux)
    return __strtoll(s, endptr, base);
#else
    return strtoll(s, endptr, base);
#endif
}
static longlong my_atoll(const char *number, const char *end, int *error)
{
  char buffer[255];
  longlong llval= 0;
  size_t i;
  *error= 0;
  /* set error at the following conditions:
     - string contains invalid character(s)
     - length > 254
     - strtoll returns invalid range
  */

  memcpy(buffer, number, MIN((uint)(end - number), 254));
  buffer[(uint)(end - number)]= 0;

  errno= 0;
#ifdef _MSC_VER
  llval =  _strtoi64(buffer, NULL, 10);
#else
  llval= strtoll(buffer, NULL, 10);
#endif

  /* check size */
  if ((uint)(end - number) > 254)
  {
    *error= 1;
    return llval;
  }

  /* check characters */
  for (i=0; i < strlen(buffer); i++)
  {
     if ((buffer[i] < '0' || buffer[i] > '9') && !isspace(buffer[i]))
     {
       *error= 1;
       return llval;
     }
  }
 
  /* check strtoll result */ 
  if (errno == ERANGE)
    *error= errno;
  return llval;
}
Example #20
0
static bool HexToFloat64(const TArgInfo &info){
	const TString1D &tmp = info.m_arg;
	size_t n = tmp.size();
	if(n){
		for(size_t i=0 ; i!=n ; ++i){
			uint64 x = _strtoi64(tmp[i].c_str(),NULL,16);
			if(0<i){
				printf(" ");
			}
			//printf("[%016I64x]", x);
			printf("%f", *(double*)&x);
		}
		//printf("\n");
	}
	if(n==0){
		return false;
	}
	return true;
}
Example #21
0
int luaU_str2oid(lua_State* L)
{
	const char *s1 = luaL_checkstring(L, 1);
	char *s2;
	double n;
	UINT64 value;
	n = strtod(s1, &s2);
	if (s1 != s2) {  /* at least one valid digit? */
		while (isspace((unsigned char)(*s2))) s2++;  /* skip trailing spaces */
		if (*s2 == '\0') {  /* no invalid trailing characters? */
			value = _strtoi64(s1, &s2, 10);
			memcpy(&n, &value, sizeof(UINT64));
			lua_pushnumber(L, (lua_Number)n);
			return 1;
		}
	}
	lua_pushnil(L);  /* else not a number */
	return 1;
}
AREXPORT int ArArgumentBuilder::getArgLongLongInt(size_t whichArg,
						  bool *ok) const
{
  bool isSuccess = false;
  long long ret = 0;
    
  const char *str = getArg(whichArg);

  // If the specified arg was successfully obtained...
  if (str != NULL) {
  
    int base = 10;
    // see if its a hex number
    if (strlen(str) > 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
    {
      str = &str[2];
      base = 16;
    }

    char *endPtr = NULL;
#ifndef _MSC_VER
    ret = strtoll(str, &endPtr, base);
#else
    ret = _strtoi64(str, &endPtr, base);
#endif
 
    if (endPtr[0] == '\0' && endPtr != str) {
      isSuccess = true;
    }
  } // end if valid arg

  if (ok != NULL) {
    *ok = isSuccess;
  }
  
  if (isSuccess) 
    return ret;
  else 
    return 0;

} // end method getArgInt
Example #23
0
Bool
StrUtil_StrToInt64(int64 *out,      // OUT: The output value
                   const char *str) // IN : String to parse
{
   char *ptr;

   ASSERT(out);
   ASSERT(str);

   errno = 0;

#if defined(_WIN32)
   *out = _strtoi64(str, &ptr, 0);
#elif defined(__FreeBSD__)
   *out = strtoq(str, &ptr, 0);
#else
   *out = strtoll(str, &ptr, 0);
#endif

   return ptr[0] == '\0' && errno != ERANGE;
}
Example #24
0
int64_t TRI_Int64String (char const* str) {
  int64_t result;
  char* endptr;

#if defined(TRI_HAVE_STRTOLL_R)
  struct reent buffer;
#elif defined(TRI_HAVE__STRTOLL_R)
  struct reent buffer;
#endif

  TRI_set_errno(TRI_ERROR_NO_ERROR);

#if defined(TRI_HAVE_STRTOLL_R)
  result = strtoll_r(&buffer, str, &endptr, 10);
#elif defined(TRI_HAVE__STRTOLL_R)
  result = _strtoll_r(&buffer, str, &endptr, 10);
#elif defined(TRI_HAVE_STRTOI64)
  result = _strtoi64(str, &endptr, 10);
#elif defined(TRI_HAVE_STRTOLL)
  result = strtoll(str, &endptr, 10);
#else
#warning cannot convert string to int64
#endif

  while (isspace(*endptr)) {
    ++endptr;
  }

  if (*endptr != '\0') {
    TRI_set_errno(TRI_ERROR_ILLEGAL_NUMBER);
  }

  if (errno == ERANGE && (result == INT64_MIN || result == INT64_MAX)) {
    TRI_set_errno(TRI_ERROR_NUMERIC_OVERFLOW);
  }

  return result;
}
Example #25
0
long long
strtonum(const char *numstr, long long minval, long long maxval,
    const char **errstrp)
{
	long long ll = 0;
	char *ep;
	int error = 0;
	struct errval {
		const char *errstr;
		int err;
	} ev[4] = {
		{ NULL,		0 },
		{ "invalid",	EINVAL },
		{ "too small",	ERANGE },
		{ "too large",	ERANGE },
	};

	ev[0].err = errno;
	errno = 0;
	if (minval > maxval)
		error = INVALID;
	else {
		ll = _strtoi64(numstr, &ep, 10);
		if (numstr == ep || *ep != '\0')
			error = INVALID;
		else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval)
			error = TOOSMALL;
		else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
			error = TOOLARGE;
	}
	if (errstrp != NULL)
		*errstrp = ev[error].errstr;
	errno = ev[error].err;
	if (error)
		ll = 0;

	return (ll);
}
Example #26
0
static bool ConvertNumber(const TArgInfo &info, int dst, int src){
	const TString1D &tmp = info.m_arg;
	size_t n = tmp.size();
	if(n){
		char	buf[256];
		for(size_t i=0 ; i!=n ; ++i){
			uint64 x = _strtoi64(tmp[i].c_str(),NULL,src);
			if(0<i){
				printf(" ");
			}
			_ui64toa_s(x,buf,sizeof(buf),dst);
			if(dst==16){
				printf("0x");
			}
			printf("%s",buf);
		}
		//printf("\n");
	}
	if(n==0){
		return false;
	}
	return true;
}
Example #27
0
    long long parseLL( const char *n ) {
        long long ret;
        uassert( 13307, "cannot convert empty string to long long", *n != 0 );
#if !defined(_WIN32)
        char *endPtr = 0;
        errno = 0;
        ret = strtoll( n, &endPtr, 10 );
        uassert( 13305, "could not convert string to long long", *endPtr == 0 && errno == 0 );
#elif _MSC_VER>=1600    // 1600 is VS2k10 1500 is VS2k8
        size_t endLen = 0;
        try {
            ret = stoll( n, &endLen, 10 );
        }
        catch ( ... ) {
            endLen = 0;
        }
        uassert( 13306, "could not convert string to long long", endLen != 0 && n[ endLen ] == 0 );
#else // stoll() wasn't introduced until VS 2010.
        char* endPtr = 0;
        ret = _strtoi64( n, &endPtr, 10 );
        uassert( 13310, "could not convert string to long long", (*endPtr == 0) && (ret != _I64_MAX) && (ret != _I64_MIN) );
#endif // !defined(_WIN32)
        return ret;
    }
Example #28
0
//////////
//
// Function: VAL()
// Returns a numeric or currency value from a expression.
//
//////
// Version 0.58
// Last update:
//     Mar.22.2015
//////
// Change log:
//     Mar.21.2015 - Initial creation by Stefano D'Amico
//////
// Parameters:
//     varExpr			-- Any, to convert
//	   varIgnoreList	-- Characters to ignore
//
//////
// Returns:
//    Numeric		--	VAL( ) returns the numbers in the character expression from left to right until a non-numeric character is encountered.
//						Leading blanks are ignored.
//						VAL( ) returns 0 if the first character of the character expression is not a number, a dollar sign ($), a plus sign (+), or minus sign (-).
//////
	void function_val(SReturnsParams* rpar)
	{
		SVariable*	varExpr			= rpar->ip[0];
		SVariable*	varIgnoreChars	= rpar->ip[1];

		s8			c, cCurrency, cPoint, cSeparator;
		s32			lnI, lnJ, lnBuffOffset;
		s64			lnValue;
		f64			lfValue;
		bool		llAsInteger, llStillGoing, llCurrency;
		SVariable*	varCurrency;
		SVariable*	varPoint;
		SVariable*	varSeparator;
		SVariable*	result;
		u32			errorNum;
        bool		error;
		s8			buffer[64];


		//////////
		// Parameter 1 must be valid
		//////
			rpar->rp[0] = NULL;
			if (!iVariable_isValid(varExpr))
			{
				iError_report_byNumber(_ERROR_P1_IS_INCORRECT, iVariable_get_relatedComp(varExpr), false);
				return;
			}


		//////////
		// If numeric, copy whatever's already there
		//////
			if (varExpr->varType >= _VAR_TYPE_NUMERIC_START && varExpr->varType <= _VAR_TYPE_NUMERIC_END)
			{
				// Copy The existing variable
				result = iVariable_copy(varExpr, false);
				if (!result)
					iError_report_byNumber(_ERROR_INTERNAL_ERROR, iVariable_get_relatedComp(varExpr), false);

				// Success or failure, return our result
				rpar->rp[0] = result;
				return;
			}



		//////////
		// Determine what we're evaluating
		//////
			switch (varExpr->varType)
			{
				case _VAR_TYPE_NULL:
					iError_report_byNumber(_ERROR_P1_IS_INCORRECT, iVariable_get_relatedComp(varExpr), false);
					return;
					break;

				case _VAR_TYPE_LOGICAL:		// 0=.F., 1=.T.
				case _VAR_TYPE_DATE:		// YYYYMMDD
					result = iVariable_create(_VAR_TYPE_S32, NULL, true);
					if (result)
					{
						// Populate the s32
						*result->value.data_s32 = iiVariable_getAs_s32(varExpr, true, &error, &errorNum);
						if (error)
							iError_report_byNumber(errorNum, iVariable_get_relatedComp(varExpr), false);
					}
					break;

				case _VAR_TYPE_DATETIME:
					// YYYYMMDDHhMmSsMss as s64
				case _VAR_TYPE_DATETIMEX:
					// YYYYMMDDHhMmSsNssssssss
					result = iVariable_create(_VAR_TYPE_S64, NULL, true);
					if (result)
					{
						// Populate the s64
						*result->value.data_s64 = iiVariable_getAs_s64(varExpr, true, &error, &errorNum);
						if (error)
							iError_report_byNumber(errorNum, iVariable_get_relatedComp(varExpr), false);
					}
					break;

				case _VAR_TYPE_CHARACTER:

					//////////
					// If present, parameter 2 must be valid
					//////
						if (varIgnoreChars)
						{
							if (!iVariable_isValid(varIgnoreChars) || !iVariable_isTypeCharacter(varIgnoreChars))
							{
								iError_report_byNumber(_ERROR_P2_IS_INCORRECT, iVariable_get_relatedComp(varIgnoreChars), false);
								return;
							}
						}


					//////////
					// Prepare our characters
					//////
						varCurrency		= propGet_settings_Currency(_settings);
						varPoint		= propGet_settings_Point(_settings);
						varSeparator	= propGet_settings_Separator(_settings);
						if (!varCurrency || !varPoint || !varSeparator)
						{
							// Should never happen
							iError_report_byNumber(_ERROR_INTERNAL_ERROR, NULL, false);
							return;
						}


					//////////
					// Create single characters
					//////
						cCurrency	= varCurrency->value.data_s8[0];
						cPoint		= varPoint->value.data_s8[0];
						cSeparator	= varSeparator->value.data_s8[0];


					//////////
					// Iterate through each character
					//////
						for (lnI = 0, lnBuffOffset = 0, llStillGoing = true, llCurrency = false; llStillGoing && lnI < (s32)varExpr->value.length && lnBuffOffset < (s32)sizeof(buffer) - 1; lnI++)
						{

							//////////
							// Grab this character
							//////
								c = varExpr->value.data[lnI];


							//////////
							// Is it a character we're including in our buffer (a number, or natural number-related symbol)?
							//////
								if ((c >= '0' && c <= '9' ) || c == '+' || c == '-' || c == cPoint)
								{
									// Yes, Copy this character
									buffer[lnBuffOffset++] = c;

								} else {
									// Are we still in a valid sequence of characters to skip?
									if (c == ' ' || c == cSeparator)
									{
										// It's a character we're skipping naturally (space, separator symbol)
										// We don't do anything here ... it's just more clear to keep this logic visible rather than inverting it. :-)

									} else if (c == cCurrency) {
										// We encountered the currency symbol, so the output will be currency
										llCurrency = true;

									} else if (varIgnoreChars) {
										// We won't continue unless we're sitting on a character in the varIgnoreChars
										for (lnJ = 0, llStillGoing = false; lnJ < varIgnoreChars->value.length; lnJ++)
										{
											// Is this one of our skip characters?
											if (c == varIgnoreChars->value.data_s8[lnJ])
											{
												llStillGoing = true;
												break;
											}
										}

									} else {
										// We're done
										break;
									}
								}

						}

						// NULL terminate
						buffer[lnBuffOffset] = 0;


					//////////
					// Convert to f64, and s64
					//////
						lfValue = atof(buffer);
#if defined(__GNUC__) || defined(__solaris__)
						lnValue = strtoll(buffer, NULL, 10);
#else
						lnValue = _strtoi64(buffer, NULL, 10);
#endif


					//////////
					// Is currency or not? If it's an integer value, store it as the same, otherwise use floating point
					//////
						if ((f64)lnValue == lfValue)
						{
							// We can return as an integer
							llAsInteger = true;
							if (llCurrency)
							{
								// Multiply by 10000 to obtain the 4 implied decimal places
								lnValue = lnValue * 10000;
								result	= iVariable_create(_VAR_TYPE_CURRENCY, NULL, true);

							} else {
								if (lnValue < (s64)_s32_max)
								{
									// We can create as an s32
									result = iVariable_create(_VAR_TYPE_S32, NULL, true);

								} else {
									// Create as an s64
									result = iVariable_create(_VAR_TYPE_S64, NULL, true);
								}
							}

						} else {
							// Must return as f64
							llAsInteger	= false;
							if (llCurrency)
							{
								// As currency
								lfValue	*= 10000.0;
								result	= iVariable_create(_VAR_TYPE_CURRENCY, NULL, true);

							} else {
								// As is
								result	= iVariable_create(_VAR_TYPE_F64, NULL, true);
							}
						}


					//////////
					// Store the result
					//////
						if (result)
						{
							if (llAsInteger)	iVariable_setNumeric_toNumericType(result, NULL, NULL, NULL, NULL, &lnValue, NULL);
							else				iVariable_setNumeric_toNumericType(result, NULL, &lfValue, NULL, NULL, NULL, NULL);
						}
						break;

				default:
					// Unrecognized type
					iError_report_byNumber(_ERROR_FEATURE_NOT_AVAILABLE, iVariable_get_relatedComp(varExpr), false);
					return;
			}


		//////////
		// Are we good?
		//////
			if (!result)
				iError_report_byNumber(_ERROR_INTERNAL_ERROR, iVariable_get_relatedComp(varExpr), false);


		//////////
        // Return our converted result
		//////
			rpar->rp[0] = result;

	}
Example #29
0
//
// Target can be file name
// Arg[0]: Device number. Optional
//
// From NdasOpReadDIB, LurnRMDRead
//
int CmdViewMeta(char* target, char* arg[])
{
	UINT64 Pos = 10;
	int retval = 0;
	SOCKET				connsock;
	PUCHAR				data = NULL;
	int					iResult;
	unsigned			UserId;
	FILE*	file = NULL;
	NDAS_DIB_V2 DIB_V2;
	NDAS_RAID_META_DATA Rmd;
	NDAS_LAST_WRITTEN_REGION_BLOCK Lwr;
	UINT32 i, j;
	
	BOOL IsTargetFile;
	UINT64 DiskSectorCount;
	char* str;
	PNDAS_UNIT_META_DATA UnitMeta;
	data = (PUCHAR) malloc(MAX_DATA_BUFFER_SIZE);

	if (strcspn(target, ":") >=strlen(target)) {
		IsTargetFile = TRUE;
	} else {
		IsTargetFile = FALSE;
	}
	if (IsTargetFile) {
		struct __stat64 statbuff;

		file = fopen(target, "r");
		if (file ==NULL) {
			fprintf(stderr, "Failed to open file\n");
			retval = GetLastError();
			goto errout; 
		}
		iResult = _stat64(target, &statbuff);
		if (iResult !=0) {
			fprintf(stderr, "Failed to get stat file\n");
			goto errout;
		}
		DiskSectorCount = statbuff.st_size/BLOCK_SIZE;
	} else {
		int dev;
		UserId = MAKE_USER_ID(DEFAULT_USER_NUM, USER_PERMISSION_SW);

		if (arg[0])
			dev = (int) _strtoi64(arg[0], NULL, 0);
		else 
			dev = 0;
		if (dev==0) {
			//
		} else {
			UserId |= 0x100;
		}

		if (ConnectToNdas(&connsock, target, UserId, NULL) !=0)
			goto errout;
		// Need to get disk info before IO
		if((iResult = GetDiskInfo(connsock, iTargetID, TRUE, TRUE)) != 0) {
			fprintf(stderr, "GetDiskInfo Failed...\n");
			retval = iResult;
			goto errout;
		}
		DiskSectorCount = PerTarget[iTargetID].SectorCount;
	}
	fprintf(stderr,"Total sector count = %I64d\n", DiskSectorCount);

	// Read an NDAS_DIB_V2 structure from the NDAS Device at NDAS_BLOCK_LOCATION_DIB_V2
	if (IsTargetFile) {
		iResult = fseek(file, (long)((DiskSectorCount + NDAS_BLOCK_LOCATION_DIB_V2)*BLOCK_SIZE), SEEK_SET);
		if (iResult != 0) {
			fprintf(stderr, "fseek error\n");
			goto errout;
		}
		iResult = (int)fread((void*)&DIB_V2, 512, 1, file);
		if (iResult == 0) {
			fprintf(stderr, "fread error\n");
			goto errout;
		}
	} else {
		iResult = IdeCommand(connsock, iTargetID, 0, WIN_READ, DiskSectorCount + NDAS_BLOCK_LOCATION_DIB_V2, 1, 0, sizeof(DIB_V2), (PCHAR)&DIB_V2, 0, 0);
		if (iResult != 0) {
			fprintf(stderr, "READ Failed.\n");
			goto errout;
		}
	}

	// Check Signature, Version and CRC informations in NDAS_DIB_V2 and accept if all the informations are correct
	if(NDAS_DIB_V2_SIGNATURE != DIB_V2.Signature)
	{
		if (DIB_V2.Signature == 0) {
			fprintf(stderr, "No DIBv2 signature. Single disk or uninitialized disk.\n");
		} else {
			fprintf(stderr, "V2 Signature mismatch\n");
		}
		goto errout;
		//goto process_v1;
	}

	if(!IS_DIB_CRC_VALID(crc32_calc, DIB_V2))
	{
		fprintf(stderr, "CRC mismatch\n");
		goto errout;
//		goto process_v1;
	}

	if(NDAS_BLOCK_SIZE_XAREA != DIB_V2.sizeXArea &&
		NDAS_BLOCK_SIZE_XAREA * SECTOR_SIZE != DIB_V2.sizeXArea)
	{
		fprintf(stderr, "Reserved size mismatch\n");
		goto errout;
//		goto process_v1;
	}

	if(DIB_V2.sizeUserSpace + DIB_V2.sizeXArea > DiskSectorCount)
	{
		fprintf(stderr, "Disk size mistmatch\n");
		goto errout;
//		goto process_v1;
	}

#if 0
	nTotalDiskCount = DIB_V2.nDiskCount + DIB_V2.nSpareCount;
	// check DIB_V2.nDiskCount
	if(!NdasOpVerifyDiskCount(DIB_V2.iMediaType, DIB_V2.nDiskCount))
		goto process_v1;
#endif
	// Dump DIB info
	printf("DIBV2 Major Version = %d, Minor version = %d\n", DIB_V2.MajorVersion, DIB_V2.MinorVersion);
	printf("User Space in sectors=%I64d, X space=%I64d\n", DIB_V2.sizeUserSpace, DIB_V2.sizeXArea);
	printf("Bitmap sector per bit=%d(%fMbyte)\n", DIB_V2.iSectorsPerBit, DIB_V2.iSectorsPerBit / 2.0/1024);
	switch(DIB_V2.iMediaType) {
	case NMT_SINGLE:		str="Single"; break;
	case NMT_MIRROR:		str="Mirror without repair info"; break;
	case NMT_AGGREGATE:		str="Aggregation"; break;
	case NMT_RAID0:			str="RAID0"; break;
	case NMT_RAID1:			str="RAID1(~3.10)"; break;
	case NMT_RAID4:			str="RAID4(~3.10)"; break;
	case NMT_RAID1R2:		str="RAID1(3.11~)"; break;
	case NMT_RAID4R2:		str="RAID4(3.11~)"; break;
	case NMT_RAID1R3:		str="RAID1(3.20~)"; break;
	case NMT_RAID4R3:		str="RAID4(3.20~)"; break;
	case NMT_AOD:			str="Append only disk"; break;
	case NMT_VDVD:			str="Virtual DVD"; break;
	case NMT_CDROM:			str="packet device, CD / DVD"; break;
	case NMT_OPMEM:			str="packet device, Magnetic Optical"; break;
	case NMT_FLASH:			str="flash card"; break;
	default: str="Unknown"; break;
	}
	printf("Media type=%d(%s)\n", DIB_V2.iMediaType, str);

	printf("Diskcount=%d, Sequence=%d, SpareCount=%d\n", 
		DIB_V2.nDiskCount, DIB_V2.iSequence, DIB_V2.nSpareCount);

	for(i=0;i<DIB_V2.nDiskCount+DIB_V2.nSpareCount;i++) {
		printf(" * Unit disk %d: ", i);
		printf("MAC %02x:%02x:%02x:%02x:%02x:%02x, VID: %x, UnitNumber=%d, HwVersion=%d\n",
			DIB_V2.UnitDisks[i].MACAddr[0], DIB_V2.UnitDisks[i].MACAddr[1], DIB_V2.UnitDisks[i].MACAddr[2],
			DIB_V2.UnitDisks[i].MACAddr[3], DIB_V2.UnitDisks[i].MACAddr[4], DIB_V2.UnitDisks[i].MACAddr[5],
			DIB_V2.UnitDisks[i].VID,
			DIB_V2.UnitDisks[i].UnitNumber,
			DIB_V2.UnitDiskInfos[i].HwVersion
			);
	}

	// Show RMD info 

	if (IsTargetFile) {
		iResult = fseek(file, (long)((DiskSectorCount + NDAS_BLOCK_LOCATION_RMD)*BLOCK_SIZE), SEEK_SET);
		if (iResult != 0) {
			fprintf(stderr, "fseek error\n");
			goto errout;
		}
		iResult = (int)fread((void*)&Rmd, 512, 1, file);
		if (iResult == 0) {
			fprintf(stderr, "fread error\n");
			goto errout;
		}
	} else {
		iResult = IdeCommand(connsock, iTargetID, 0, WIN_READ, DiskSectorCount + NDAS_BLOCK_LOCATION_RMD, 1, 0, sizeof(Rmd), (PCHAR)&Rmd, 0, 0);
		if (iResult != 0) {
			fprintf(stderr, "READ Failed.\n");
			goto errout;
		}
	}

	// Check Signature, Version and CRC informations in NDAS_DIB_V2 and accept if all the informations are correct
	if(NDAS_RAID_META_DATA_SIGNATURE != Rmd.Signature)
	{
		fprintf(stderr, "RMD Signature mismatch: %I64x\n", Rmd.Signature);
		goto errout;
		//goto process_v1;
	}

	if(!IS_RMD_CRC_VALID(crc32_calc, Rmd))
	{
		fprintf(stderr, "RMD CRC mismatch\n");
		goto errout;
//		goto process_v1;
	}
	printf("RAID Set ID  = %08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x\n",
		Rmd.guid.Data1, Rmd.guid.Data2, Rmd.guid.Data3,
		Rmd.guid.Data4[0], Rmd.guid.Data4[1], Rmd.guid.Data4[2], Rmd.guid.Data4[3], 
		Rmd.guid.Data4[4], Rmd.guid.Data4[5], Rmd.guid.Data4[6], Rmd.guid.Data4[7]
	);
	printf("Config Set ID= %08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x\n",
		Rmd.ConfigSetId.Data1, Rmd.ConfigSetId.Data2, Rmd.ConfigSetId.Data3,
		Rmd.ConfigSetId.Data4[0], Rmd.ConfigSetId.Data4[1], Rmd.ConfigSetId.Data4[2], Rmd.ConfigSetId.Data4[3], 
		Rmd.ConfigSetId.Data4[4], Rmd.ConfigSetId.Data4[5], Rmd.ConfigSetId.Data4[6], Rmd.ConfigSetId.Data4[7]
	);
	printf("USN: %d\n", Rmd.uiUSN);
	
	switch(Rmd.state & (NDAS_RAID_META_DATA_STATE_MOUNTED | NDAS_RAID_META_DATA_STATE_UNMOUNTED)) {
		case NDAS_RAID_META_DATA_STATE_MOUNTED:	str= "Mounted"; break;
		case NDAS_RAID_META_DATA_STATE_UNMOUNTED:	str= "Unmounted"; break;
		default: str = "Unknown/Never Mounted"; break;
	}
	if (Rmd.state & NDAS_RAID_META_DATA_STATE_USED_IN_DEGRADED) {
		printf("This member is used in degraded mode\n");
	}

	printf("State: %d(%s)\n", Rmd.state, str);
	for(i=0;i<NDAS_DRAID_ARBITER_ADDR_COUNT;i++) {
		if (Rmd.ArbiterInfo[i].Type == 0)
			break;
		printf("DRAID Listen Address: Type %d - %02x:%02x:%02x:%02x:%02x:%02x\n", 
			Rmd.ArbiterInfo[i].Type,
			Rmd.ArbiterInfo[i].Addr[0], Rmd.ArbiterInfo[i].Addr[1], Rmd.ArbiterInfo[i].Addr[2],
			Rmd.ArbiterInfo[i].Addr[3], Rmd.ArbiterInfo[i].Addr[4], Rmd.ArbiterInfo[i].Addr[5]
		);
	}
	for(i=0;i<DIB_V2.nDiskCount+DIB_V2.nSpareCount;i++) {
		char* DefectStr;
		printf(" * Role %d: ", i);
		UnitMeta = &Rmd.UnitMetaData[i];

		printf("Unit index=%d  Status=%d(%s%s%s%s%s%s)\n",
			UnitMeta->iUnitDeviceIdx, UnitMeta->UnitDeviceStatus, 
			(UnitMeta->UnitDeviceStatus==0)?"Normal ":"",
			(UnitMeta->UnitDeviceStatus & NDAS_UNIT_META_BIND_STATUS_NOT_SYNCED)?"Out-of-sync ":"",
			(UnitMeta->UnitDeviceStatus & NDAS_UNIT_META_BIND_STATUS_SPARE)?"Spare ":"",
			(UnitMeta->UnitDeviceStatus & NDAS_UNIT_META_BIND_STATUS_BAD_DISK)?"Bad disk ":"",
			(UnitMeta->UnitDeviceStatus & NDAS_UNIT_META_BIND_STATUS_BAD_SECTOR)?"Bad sector ":"",
			(UnitMeta->UnitDeviceStatus & NDAS_UNIT_META_BIND_STATUS_REPLACED_BY_SPARE)?"Replaced by spare ":""
			);
	}

	//
	// Dump bitmap
	// 
	if (DIB_V2.iMediaType == NMT_RAID1R3) 
	{
		UINT32 BitCount = (UINT32)((DIB_V2.sizeUserSpace + DIB_V2.iSectorsPerBit - 1)/DIB_V2.iSectorsPerBit);
		UINT32 BmpSectorCount = (BitCount + NDAS_BIT_PER_OOS_BITMAP_BLOCK -1)/NDAS_BIT_PER_OOS_BITMAP_BLOCK;
		UINT32 CurBitCount;
		PNDAS_OOS_BITMAP_BLOCK BmpBuffer;
		UCHAR OnBits[] = {1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7};
		UINT32 BitOn, BitOnStart, BitOnEnd;

		printf("\nBitmap sector per bit=0x%x, Bit count =0x%x, BmpSector count=0x%x\n", 
			DIB_V2.iSectorsPerBit, BitCount, BmpSectorCount);
		BmpBuffer = (PNDAS_OOS_BITMAP_BLOCK) malloc(BmpSectorCount* 512);
		iResult = IdeCommand(connsock, iTargetID, 0, WIN_READ, DiskSectorCount + NDAS_BLOCK_LOCATION_BITMAP, (_int16)BmpSectorCount, 0, BmpSectorCount* 512, (PCHAR)BmpBuffer, 0, 0);
		if (iResult != 0) {
			fprintf(stderr, "READ Failed.\n");
			free(BmpBuffer);
			goto errout;
		}
		CurBitCount = 0;
		for(i=0;i<BmpSectorCount;i++) {
			printf("  Bitmap sector %d, Seq head=%I64x, tail=%I64x\n", i, BmpBuffer[i].SequenceNumHead,BmpBuffer[i].SequenceNumTail);
			BitOn = FALSE;
			BitOnStart = BitOnEnd = 0;
			for(j=0;j<NDAS_BYTE_PER_OOS_BITMAP_BLOCK * 8;j++) {
				if (BitOn == FALSE && (BmpBuffer[i].Bits[j/8] & OnBits[j%8])) {
					BitOn = TRUE;
					BitOnStart = i * NDAS_BYTE_PER_OOS_BITMAP_BLOCK * 8 + j;
					printf("    Bit on from bit %x ~ ", BitOnStart);
				}
				if (BitOn == TRUE && (BmpBuffer[i].Bits[j/8] & OnBits[j%8]) == 0) {
					BitOn = FALSE;
					BitOnEnd = i * NDAS_BYTE_PER_OOS_BITMAP_BLOCK * 8 + j;
					printf("%x\n", BitOnEnd-1);
				}
				CurBitCount++;
				if (CurBitCount >= BitCount)
					break;
			}
			if (BitOn == TRUE) {
				printf("%x\n", i * NDAS_BYTE_PER_OOS_BITMAP_BLOCK * 8 + j);
			}
		}
		free(BmpBuffer);
	}
	printf("\n");
	DisconnectFromNdas(connsock, UserId);
errout:
	closesocket(connsock);
	if (data)
		free(data);
	return retval;
}
Example #30
0
// Tokenize number constants:
//   1.  Integers:  [-] 0[0-7]+ | 0[xX][0-9a-fA-F]+ | [0-9]+
//   2.  Reals   :  [-] [0-9]*\.[0-9]* (e|E) [+-]? [0-9]+
int Lexer::
tokenizeNumber (void)
{
	enum { NONE, INTEGER, REAL };
	int		numberType = NONE;
	Value::NumberFactor f;
	long long integer=0;
	double	real=0;
	int 	och;

	och = ch;
	mark( );
	wind( );

	if ( och == '-' ) {
		// This may be a negative number or the unary minus operator
		// The subsequent two characters will tell us which.
		if ( isdigit( ch ) ) {
			// It looks like a negative number, keep reading.
			och = ch;
			wind();
		} else if ( ch == '.' ) {
			// This could be a real number or an attribute reference
			// starting with dot. Look at the second character.
			int ch2 = lexSource->ReadCharacter();
			if ( ch2 >= 0 ) {
				lexSource->UnreadCharacter();
			}
			if ( !isdigit( ch2 ) ) {
				// It's not a real number, return a minus token.
				cut();
				tokenType = LEX_MINUS;
				return tokenType;
			}
			// It looks like a negative real, keep reading.
		} else {
			// It's not a number, return a minus token.
			cut();
			tokenType = LEX_MINUS;
			return tokenType;
		}
	}

	if( och == '0' ) {
		// number is octal, hex or real
		if( tolower( ch ) == 'x' ) {
			// get hex digits only; parse hex-digit+
			numberType = INTEGER;
			wind( );
			if( !isxdigit( ch ) ) {
				cut( );
				tokenType = LEX_TOKEN_ERROR;
				return( tokenType ) ;
			}
			while( isxdigit( ch ) ) {
				wind( );
			}
		} else {
			// get octal or real
			numberType = INTEGER;
			while( isdigit( ch ) ) {
				wind( );
				if( !isodigit( ch ) ) {
					// not an octal number
					numberType = REAL;
				}
			}
			if( ch == '.' || tolower( ch ) == 'e' ) {
				numberType = REAL;
			} else if( numberType == REAL ) {
				// non-octal digits, but not a real (no '.' or 'e')
				// so, illegal octal constant
				cut( );
				tokenType = LEX_TOKEN_ERROR;
				return( tokenType );
			}
		}
	} else if( isdigit( och ) ) {
		// decimal or real; get digits
		while( isdigit( ch ) ) {
			wind( );
		}
		numberType = ( ch=='.' || tolower( ch )=='e' ) ? REAL : INTEGER;
	} 

	if( och == '.' || ch == '.' ) {
		// fraction part of real or selection operator
		if( ch == '.' ) wind( );
		if( isdigit( ch ) ) {
			// real; get digits after decimal point
			numberType = REAL;
			while( isdigit( ch ) ) {
				wind( );
			}
		} else {
			if( numberType != NONE ) {
				// initially like a number, but no digit following the '.'
				cut( );
				tokenType = LEX_TOKEN_ERROR;
				return( tokenType );
			}
			// selection operator
			cut( );
			tokenType = LEX_SELECTION;
			return( tokenType );
		}
	}

	// if we are tokenizing a real, the (optional) exponent part is left
	//   i.e., [eE][+-]?[0-9]+
	if( numberType == REAL && tolower( ch ) == 'e' ) {
		wind( );
		if( ch == '+' || ch == '-' ) wind( );
		if( !isdigit( ch ) ) {
			cut( );
			tokenType = LEX_TOKEN_ERROR;
			return( tokenType );
		}
		while( isdigit( ch ) ) {
			wind( );
		}
	}

	if( numberType == INTEGER ) {
		cut( );
		long long l;
		int base = 0;
		if ( _useOldClassAdSemantics ) {
			// Old ClassAds don't support octal or hexidecimal
			// representations for integers.
			base = 10;
		}
#ifdef WIN32
		l = _strtoi64( lexBuffer.c_str(), NULL, base );
#else
		l = strtoll( lexBuffer.c_str(), NULL, base );
#endif
		integer = l;
	} else if( numberType == REAL ) {
		cut( );
		real = strtod( lexBuffer.c_str(), NULL );
	} else {
		/* If we've reached this point, we have a serious programming
		 * error: tokenizeNumber should only be called if we are
		 * lexing a number or a selection, and we didn't find a number
		 * or a selection. This should really never happen, so we
		 * bomb if it does. It should be reported as a bug.
		 */
			CLASSAD_EXCEPT("Should not reach here");
	}

	switch( toupper( ch ) ) {
		case 'B': f = Value::B_FACTOR; wind( ); break;	
		case 'K': f = Value::K_FACTOR; wind( ); break;
		case 'M': f = Value::M_FACTOR; wind( ); break;
		case 'G': f = Value::G_FACTOR; wind( ); break;
		case 'T': f = Value::T_FACTOR; wind( ); break;
		default:
			f = Value::NO_FACTOR;
	}

	if( numberType == INTEGER ) {
		yylval.SetIntValue( integer, f );
		yylval.SetTokenType( LEX_INTEGER_VALUE );
		tokenType = LEX_INTEGER_VALUE;
	} else {
		yylval.SetRealValue( real, f );
		yylval.SetTokenType( LEX_REAL_VALUE );
		tokenType = LEX_REAL_VALUE;
	}

	return( tokenType );
}