Ejemplo n.º 1
0
// don't count ezquake color sequence
int strlen_color(const char *str)
{
	int len = 0;

	if ( !str )
		return 0;

	while ( str[0] )
	{
		if (str[0] == '&')
		{
			if (str[1] == 'c' && HexToInt(str[2]) >= 0 && HexToInt(str[3]) >= 0 && HexToInt(str[4]) >= 0)
			{
				str += 5; // skip "&cRGB"
				continue;
			}
			else if (str[1] == 'r')
			{
				str += 2; // skip "&r"
				continue;
			}
		}

		len++;
		str++;
	}

	return len;
}
Ejemplo n.º 2
0
COLORREF SVGPaintParser::ScanHexColor()
{
	const uni_char *color_string = tokenizer.CurrentString();
	unsigned c = tokenizer.CurrentCharacter();
	unsigned n = 0;

	while (c >= 'a' && c <= 'f' ||
		   c >= 'A' && c <= 'F' ||
		   c >= '0' && c <= '9')
	{
		c = tokenizer.Shift(n);
	}

	if (n != 3 && n != 6)
		return USE_DEFAULT_COLOR;

	n /= 3; // Length per component

	unsigned r = HexToInt(color_string, n);
	unsigned g = HexToInt(color_string + n, n);
	unsigned b = HexToInt(color_string + 2 * n, n);

	if (n == 1)
		r *= 0x11, g *= 0x11, b *= 0x11;

	return OP_RGB(r, g, b);
}
Ejemplo n.º 3
0
// skip ezquake color sequence
void Util_SkipEZColors(char *dst, const char *src, size_t size)
{
	if ( !dst || !src )
		Sys_Error("Util_SkipColors: invalid input params");

	if ( !size )
		return; // no space

	while ( src[0] && size )
	{
		if ( src[0] == '&' )
		{
			if ( src[1] == 'c' && HexToInt(src[2]) >= 0 && HexToInt(src[3]) >= 0 && HexToInt(src[4]) >= 0 )
			{
				src += 5; // skip "&cRGB"
				continue;
			}
			else if ( src[1] == 'r' )
			{
				src += 2; // skip "&r"
				continue;
			}
		}

		*dst++ = *src++;
		size--;
	}

	if ( !size )
		dst--; // seems we truncate string, step back for null terminator

	dst[0] = 0;
}
Ejemplo n.º 4
0
ECode UriCodec::Decode(
    /* [in] */ const String& s,
    /* [in] */ Boolean convertPlus,
    /* [in] */ ICharset* charset,
    /* [in] */ Boolean throwOnFailure,
    /* [out] */ String* decodedString)
{
    VALIDATE_NOT_NULL(decodedString);
    if (s.IndexOf('%') == -1 && (!convertPlus || s.IndexOf('+') == -1)) {
        *decodedString = s;
        return NOERROR;
    }

    StringBuilder result(s.GetByteLength());
    AutoPtr<IByteArrayOutputStream> out;
    CByteArrayOutputStream::New((IByteArrayOutputStream**)&out);
    IOutputStream* os = IOutputStream::Probe(out);
    AutoPtr<ArrayOf<Char32> > char32Array = s.GetChars();
    for (Int32 i = 0; i < s.GetLength();) {
        Char32 c = (*char32Array)[i];
        if (c == '%') {
            do {
                Int32 d1, d2;
                if (i + 2 < s.GetLength()
                        && (d1 = HexToInt((*char32Array)[i + 1])) != -1
                        && (d2 = HexToInt((*char32Array)[i + 2])) != -1) {
                    os->Write((Byte) ((d1 << 4) + d2));
                }
                else if (throwOnFailure) {
                    return E_ILLEGAL_ARGUMENT_EXCEPTION;
                }
                else {
                    // TODO: unicode escape
                    const char* chars = "\ufffd";
                    AutoPtr<ArrayOf<Byte> > replacement = GetBytes(chars, charset);
                    os->Write(replacement, 0, replacement->GetLength());
                }
                i += 3;
            } while (i < s.GetLength() && (*char32Array)[i] == '%');

            AutoPtr<ArrayOf<Byte> > bytes;
            out->ToByteArray((ArrayOf<Byte>**)&bytes);
            //result.append(new String(out.toByteArray(), charset);
            result.Append(String((char*)bytes->GetPayload()));
            out->Reset();
        }
        else {
            if (convertPlus && c == '+') {
                c = ' ';
            }
            result.AppendChar(c);
            i++;
        }
    }
    *decodedString = result.ToString();
    return NOERROR;
}
Ejemplo n.º 5
0
		void HexToBinary(stream::IStream& stream, const WString& hexText)
		{
			const wchar_t* buffer = hexText.Buffer();
			vint count = hexText.Length() / 2;
			for (vint i = 0; i < count; i++)
			{
				vuint8_t byte = (vuint8_t)(HexToInt(buffer[0]) * 16 + HexToInt(buffer[1]));
				buffer += 2;
				stream.Write(&byte, 1);
			}
		}
Ejemplo n.º 6
0
// Intel-HEXファイルを読み込んでバッファに格納
bool LoadIntelHEX(const wchar_t *filepath, char *buf, char *used, unsigned int size, unsigned int start_address){
	FILE *fp;

	// ファイルを開く
	_wfopen_s(&fp, filepath, L"r,ccs=UNICODE");
	if (fp == NULL) return false;

	// バッファを0xFFで初期化
	memset(buf, 0xFF, size);
	if (used != nullptr)
		memset(used, 0, size);

	// Intel-Hexをデコード
	bool err = false;
	unsigned int ext_address = 0;
	for(int cnt = 0; cnt < 10000; cnt++){
		wchar_t line[128];
		wchar_t *ptr;

		ptr = fgetws(line, 128, fp);
		if (ptr == nullptr){err = true; break;}
		if (*ptr++ != ':'){err = true; break;}

		unsigned int length, offset, type;
		length	= HexToInt(ptr, &ptr, 2);
		offset	= HexToInt(ptr, &ptr, 4);
		type	= HexToInt(ptr, &ptr, 2);
		if (type == 0){
			// データ
			unsigned int address = ext_address + offset - start_address;
			for(unsigned int cnt = 0; cnt < length; cnt++){
				if (address < 0) continue;
				if (size <= address) break;//{err = true; break;}
				buf[address] = HexToInt(ptr, &ptr, 2);
				if (used != nullptr)
					used[address] = 1;
				address++;
			}
			//if (err == true)
			//	break;
		}else if (type == 1){
			// エンド
			break;
		}else if (type == 4){
			// 拡張リニアアドレス
			ext_address = HexToInt(ptr, &ptr, 4) << 16;
		}
	}
	fclose(fp);

	return !err;
}
Ejemplo n.º 7
0
bool JumpropesCommon::HttpClient::isEndOfChunkedData() {
   if ( iChunkScanLastSize == 0 ) {
      return true;
   }

   StringVectorRange searchRange;

   // nog geen chunklength string gevonden
   if ( iChunkScanLastSize == -1 ) {
      bWaitForChunk = true;

      searchRange.start_ind = lastChunkRange.end_ind;
      searchRange.start_pos = lastChunkRange.end_pos;

      connection->bufferlock.lockWhenAvailable( GFLOCK_INFINITEWAIT );

      bool bPos = connection->receivedData.pos( &searchRange, crlf, strlen(crlf) );
      if ( bPos ) {
         bWaitForChunk = false;

         StringVectorRange tmpRange;
         tmpRange.start_ind = lastChunkRange.end_ind;
         tmpRange.start_pos = lastChunkRange.end_pos;
         tmpRange.end_ind   = searchRange.start_ind;
         tmpRange.end_pos   = searchRange.start_pos;
         connection->receivedData.endMinusOne( &tmpRange );

         lastChunkRange.end_ind = searchRange.end_ind;
         lastChunkRange.end_pos = searchRange.end_pos + 1;

         String *tmp = connection->receivedData.copy( &tmpRange );
         tmp->ltrim_ansi();
         tmp->uppercase_ansi();

         iChunkScanLastSize = HexToInt( tmp );
         delete tmp;
      }

      connection->bufferlock.unlock();
   }

   if ( iChunkScanLastSize == 0 ) {
      return true;
   }

   if ( !bWaitForChunk ) {
      // do stuff
      connection->bufferlock.lockWhenAvailable( GFLOCK_INFINITEWAIT );
      if ( ( connection->receivedData.getLength( lastChunkRange.end_ind ) - lastChunkRange.end_pos ) >= iChunkScanLastSize ) {
         String *tmpData = connection->receivedData.copy( lastChunkRange.end_ind, lastChunkRange.end_pos, iChunkScanLastSize );
         onContent.execute( tmpData );
         delete tmpData;
         lastChunkRange.end_pos += iChunkScanLastSize + strlen(crlf);
         iChunkScanLastSize = -1;
      }
      connection->bufferlock.unlock();
   }

   return false;
}
Ejemplo n.º 8
0
/**
 * extracts the debug addr's from the output of backtrace_symbols()
 */
static uintptr_t ExtractAddr(const StackFrame& frame)
{
	// frame.symbol examples:
	//
	// ./spring() [0x84b7b5]
	// /usr/lib/libc.so.6(abort+0x16a) [0x7fc022c69e6a]
	// /usr/lib/libstdc++.so.6(+0x5eea1) [0x7fc023551ea1]

	uintptr_t addr = INVALID_ADDR_INDICATOR;
	const std::string& line = frame.symbol;
	size_t begin = line.find_last_of('[');
	size_t end = std::string::npos;
	if (begin != std::string::npos) {
		end = line.find_last_of(']');
	}
	if ((begin != std::string::npos) && (end != std::string::npos)) {
		addr = HexToInt(line.substr(begin+1, end-begin-1).c_str());
	}

	begin = line.find_last_of('(');
	end = line.find_last_of(')');
	if (end - begin != 1) {
		Dl_info info;
		if (dladdr(frame.ip, &info) != 0) {
			addr = (uintptr_t)frame.ip - (uintptr_t)info.dli_fbase;
		}
	}

	return addr;
}
int main(){
    int i;
    char HexArray[]="C0B0A0FF";
    HexToInt(HexArray,8);
    HexToBinary(HexArray,8);

return 0;
}
Ejemplo n.º 10
0
	bool CheckIdent(userrec* user)
	{
		int ip[4];
		char* ident;
		char newip[16];
		int len = strlen(user->ident);
		
		if(len == 8)
			ident = user->ident;
		else if(len == 9 && *user->ident == '~')
			ident = user->ident+1;
		else
			return false;
	
		for(int i = 0; i < 4; i++)
			if(!HexToInt(ip[i], ident + i*2))
				return false;

		snprintf(newip, 16, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
			
		user->Extend("cgiirc_realhost", new std::string(user->host));
		user->Extend("cgiirc_realip", new std::string(user->GetIPString()));
		user->RemoveCloneCounts();
#ifdef IPV6
		if (user->GetProtocolFamily() == AF_INET6)
			inet_pton(AF_INET6, newip, &((sockaddr_in6*)user->ip)->sin6_addr);
		else
#endif
		inet_aton(newip, &((sockaddr_in*)user->ip)->sin_addr);
		ServerInstance->AddLocalClone(user);
		ServerInstance->AddGlobalClone(user);
		user->CheckClass();
		try
		{
			strlcpy(user->host, newip, 16);
			strlcpy(user->dhost, newip, 16);
			strlcpy(user->ident, "~cgiirc", 8);

			bool cached;
			CGIResolver* r = new CGIResolver(this, ServerInstance, NotifyOpers, newip, false, user, user->GetFd(), "IDENT", cached);
			ServerInstance->AddResolver(r, cached);
		}
		catch (...)
		{
			strlcpy(user->host, newip, 16);
			strlcpy(user->dhost, newip, 16);
			strlcpy(user->ident, "~cgiirc", 8);
			user->InvalidateCache();

			if(NotifyOpers)
				 ServerInstance->WriteOpers("*** Connecting user %s detected as using CGI:IRC (%s), but i could not resolve their hostname!", user->nick, user->host);
		}
		/*strlcpy(user->host, newip, 16);
		strlcpy(user->dhost, newip, 16);
		strlcpy(user->ident, "~cgiirc", 8);*/

		return true;
	}
Ejemplo n.º 11
0
int Bettysoft::Crypt::Crypt::readPadding(const char *path){
	std::ifstream ifOpenReadVersion(path,std::ios::binary);
	ifOpenReadVersion.seekg(8,std::ios::beg);
	char chPadding[3];
	ifOpenReadVersion.getline(chPadding,3);
	ifOpenReadVersion.seekg(0,std::ios::beg);
	ifOpenReadVersion.close();
	return HexToInt(chPadding[0],chPadding[1]);
};
Ejemplo n.º 12
0
LPVOID CCommonUtils::HexToBinary(BSTR bstrHex, ULONG* pulSize)
{
    LPBYTE lpRet = NULL;
    UINT  len = ::SysStringLen(bstrHex);
    UINT  pos = 0;

    if(len & 1)
    {
        // Invalid length, must be a multiple of 2 characters
        throw _com_error(E_INVALIDARG);
    }

    lpRet = static_cast<LPBYTE>(LocalAlloc(LPTR, len / 2));
    if(lpRet == NULL)
    {
        throw _com_error(E_FAIL);
    }

    for(pos = 0; pos < len; pos += 2)
    {
        int unib = HexToInt(bstrHex[pos]);
        int lnib = HexToInt(bstrHex[pos+1]);

        if((unib < 0) || (lnib < 0))
        {
            break;
        }

        lpRet[pos/2] = static_cast<BYTE>((unib << 4) | (lnib));
    }

    if(pos == len)
    {
        *pulSize = len / 2;
    }
    else
    {
        (void)LocalFree(lpRet);
        lpRet = NULL;
        throw _com_error(E_INVALIDARG);
    }

    return lpRet;
}
Ejemplo n.º 13
0
static	void
DecodeStringToBinary(
	byte	*p,
	size_t	size,
	char	*str)
{
#ifdef	BINARY_IS_BASE64
	DecodeBase64(p,size,str,strlen(str));
#else
	int		i;

	for	( i = 0 ; i < size ; i ++ , p ++ ) {
		if		(  *str  ==  '\\'  ) {
			str ++;
			switch	(*str) {
			  case	'b':
				*p = '\b';
				str ++;
				break;
			  case	'f':
				*p = '\f';
				str ++;
				break;
			  case	'n':
				*p = '\n';
				str ++;
				break;
			  case	'r':
				*p = '\r';
				str ++;
				break;
			  case	't':
				*p = '\t';
				str ++;
				break;
			  case	'u':
				str ++;
				*p = (unsigned char)HexToInt(str,2);
				str += 2;
				break;
			  default:
				*p = *str;
				str ++;
				break;
			}
		} else {
			*p = *str;
			str ++;
		}
	}
#endif
}
Ejemplo n.º 14
0
ECode UriCodec::Validate(
    /* [in] */ const String& uri,
    /* [in] */ Int32 start,
    /* [in] */ Int32 end,
    /* [in] */ const String& name,
    /* [out] */ String* result)
{
    VALIDATE_NOT_NULL(result);
    *result = NULL;

    AutoPtr<ArrayOf<Char32> > char32Array = uri.GetChars();
    for(Int32 i = start; i < end;) {
        Char32 ch = (*char32Array)[i];
        if ((ch >= 'a' && ch <= 'z')
            || (ch >= 'A' && ch <= 'Z')
            || (ch >= '0' && ch <= '9')
            || IsRetained(ch)){
            ++i;
        }
        else if (ch == '%'){
            if(i + 2 >= end){
                return E_URI_SYNTAX_EXCEPTION;
            }

            Int32 d1 = HexToInt((*char32Array)[i+1]);
            Int32 d2 = HexToInt((*char32Array)[i+2]);
            if (d1 == -1 || d2 == -1) {
                return E_URI_SYNTAX_EXCEPTION;
            }
            i += 3;
        }
        else{
            return E_URI_SYNTAX_EXCEPTION;
        }
    }
    *result = uri.Substring(start, end);
    return NOERROR;
}
Ejemplo n.º 15
0
/**
 * extracts the debug addr's from the output of backtrace_symbols()
 */
static uintptr_t ExtractAddr(const std::string& line)
{
	// example address: "0x89a8206"
	uintptr_t addr = INVALID_ADDR_INDICATOR;
	size_t begin = line.find_last_of('[');
	size_t end = std::string::npos;
	if (begin != std::string::npos) {
		end = line.find_last_of(']');
	}
	if ((begin != std::string::npos) && (end != std::string::npos)) {
		addr = HexToInt(line.substr(begin+1, end-begin-1).c_str());
	}
	return addr;
}
Ejemplo n.º 16
0
uint32_t ParseFlags(std::string string)
{
    if(CheckHex(string))
    {
        return HexToInt(string);
    }
    else
    {
        uint32_t flags = 0;
        std::vector<std::string> v = Explode(string, "|");
        for(std::vector<std::string>::iterator it = v.begin(); it != v.end(); ++it)
        {
            std::string par = ToLower(Trim((*it)));
            if(!par.length()) continue;
            uint32_t flag = 0;
            bool erase = false;
            if(par[0] == '-')
            {
                erase = true;
                par.erase(0, 1);
            }

            if(par == "pvm")
                flag = SVF_PVM;
            else if(par == "muted")
                flag = SVF_MUTED;
            else if(par == "closed")
                flag = SVF_CLOSED;
            else if(par == "advanced_pvm")
                flag = SVF_ADVPVM;
			else if(par == "nohealing")
				flag = SVF_NOHEALING;
			else if(par == "noobsrv")
				flag = SVF_NOOBSRV;
			else if(par == "softcore")
				flag = SVF_SOFTCORE;
			else if(par == "nodrop")
				flag = SVF_NODROP;
			else if(par == "fnodrop")
				flag = SVF_FNODROP;

            if(!flag) continue;
            if(!erase) flags |= flag;
            else flags &= ~flag;
        }

        return flags;
    }
}
Ejemplo n.º 17
0
bool DoFlashLock(CMD_TBL *cptr, int argc, char **argv)
{
	long	i, addr, len, cnt;
	// error.
	if (argc < 2){
		printf(cptr->usage);
		return false;
	}

	switch (argc){
		// "lock [addr]".
		case 2 :
			if (!StrCmp(argv[1], "loader")){
				addr = (long)LOADER_SRAM_BASE;
				len  = (long)LOADER_SRAM_MAX_SIZE;
			}
			else if (!StrCmp(argv[1], "kernel")){
				addr = (long)KERNEL_SRAM_BASE;
				len  = (long)KERNEL_MAX_SIZE;
			}
			else if (!StrCmp(argv[1], "root")){
				addr = (long)ROOT_SRAM_BASE;
				len  = (long)ROOT_MAX_SIZE;
			}
			else {
				if (!HexToInt(argv[1], &addr, 32)){
					printf(cptr->usage);
					return false;
				}
				len = (long)FLASH_BLOCK_SIZE;
			}
			break;
		// "lock [addr] [len]".
		default :
			printf(cptr->usage);
			return false;
			break;
	}
	// lock of flash blocks.
	cnt = len/FLASH_BLOCK_SIZE + ((len&(FLASH_BLOCK_SIZE-1)) ? 1 : 0);
	for (i=0; i<cnt; i++, addr+=FLASH_BLOCK_SIZE){
		if (!FlashLock((FUNIT *)addr)) return false;
	}
	return true;
}	// DoFlashLock.
Ejemplo n.º 18
0
	const Number IntegerLiteralParser::ParseHexadecimal()
	{
		// Assert( NeedChar() == 'x' )

		IntegerBuilder integerBuilder;

		Advance();
		if (AtEnd() || NotInClass(CharClass::HEXADECIMAL))
		{
			ThrowError("Hexadecimal digit expected");
		}

		try
		{
			do
			{
				integerBuilder.OnHexadecimalDigit(HexToInt(GetChar()));

				Advance();
				if (AtEnd())
				{
					return integerBuilder.Release();
				}
			}
			while (InClass(CharClass::HEXADECIMAL));
		}
		catch (const IntegerBuilder::OverflowError &)
		{
			ThrowError("Hexadecimal number is too big");
		}

		if (InClass(CharClass::LETTER))
		{
			ThrowError("Hexadecimal digit expected");
		}

		return integerBuilder.Release();
	}
Ejemplo n.º 19
0
void ReplaceHexFormWithOrdinals( TString& astring )
{
  int sl = astring.Length();
  for( int i=1; i<=sl; i++  )
  {
    if( astring[i]=='\\' )
      if( i<sl )
        if( astring[i+1]=='\\' )
        {
          astring.Delete( i, 1 );
          sl--;
        }
        else
        {
          if( astring[i+1]!='x' || i+3>sl )
            throw TException( "String '"+astring+"' not in CSV format." );

          char c = HexToInt( astring.c_str() + (i+1), 2 );
          astring[i] = c;
          astring.Delete( i+1, 3 );
          sl -= 3;
        }
  }
}
bool BaseIndex::IsIndexValueValid(char* hexValue)
{
	ULONG value;
	bool retFlag = true;

	if (0 == strcmp(hexValue, ""))
	{
		return true;
	}

	if (CheckIfHex(hexValue))
	{
		char* subStr = new char[strlen(hexValue)];
		SubString(subStr, (const char*) hexValue, 2, (strlen(hexValue) - 2));
		value = HexToInt(subStr);
		delete[] subStr;
	}
	else
	{
		return true;
	}

	if (NULL != this->lowLimit)
	{
		if (0 != strcmp(this->lowLimit, ""))
		{
			ULONG lowlimitValue;
			if (CheckIfHex((char*) this->lowLimit))
			{
				char* subStr = new char[strlen(lowLimit)];
				SubString(subStr, lowLimit, 2, strlen(lowLimit) - 2);
				lowlimitValue = HexToInt(subStr);
				delete[] subStr;
			}
			else
			{
				lowlimitValue = atoi(lowLimit);
			}
			if (value >= lowlimitValue)
			{
				retFlag = true;
			}
			else
			{
				ocfmException objException;
				objException._ocfmRetCode.code =
						OCFM_ERR_VALUE_NOT_WITHIN_RANGE;
				objException._ocfmRetCode.errorString = new char[150];
				objException._ocfmRetCode.errorString[0] = 0;
				sprintf(objException._ocfmRetCode.errorString,
						"The entered value(%s) is less than the lower limit(%s)",
						hexValue, this->lowLimit);
				throw objException;
				//bFlag = false;
				//return bFlag;
			}
		}
	}

	if (NULL != this->highLimit)
	{
		if (0 != strcmp(this->highLimit, ""))
		{
			ULONG ulHighLimit;
			if (CheckIfHex((char*) this->highLimit))
			{
				char* subStr = new char[strlen(highLimit)];
				SubString(subStr, highLimit, 2, (strlen(highLimit) - 2));
				ulHighLimit = HexToInt(subStr);
				delete[] subStr;
			}
			else
			{
				ulHighLimit = atoi(highLimit);
			}
			if (value <= ulHighLimit)
			{
				retFlag = true;
			}
			else
			{
				ocfmException objException;
				objException._ocfmRetCode.code =
						OCFM_ERR_VALUE_NOT_WITHIN_RANGE;
				objException._ocfmRetCode.errorString = new char[150];
				objException._ocfmRetCode.errorString[0] = 0;
				sprintf(objException._ocfmRetCode.errorString,
						"The entered value(%s) is greater than the upper limit(%s)",
						hexValue, this->highLimit);
				throw objException;
				//bFlag = false;
			}
		}
	}
	return retFlag;
}
Ejemplo n.º 21
0
bool DoEraseFlashBlocks(CMD_TBL *cptr, int argc, char **argv)
{
	ulong	addr=0, len, end;
	
	switch (argc){
        case 2 :
            if (!StrCmp(argv[1], "kernel")){
                addr = (long)KERNEL_SRAM_BASE;
                len  = (long)KERNEL_MAX_SIZE;
            }
            else if (!StrCmp(argv[1], "root")){
                addr = (long)ROOT_SRAM_BASE;
                len  = (long)ROOT_MAX_SIZE;
            }
            else if (!StrCmp(argv[1], "loader")){
                addr = (long)LOADER_SRAM_BASE;
                len  = (long)LOADER_MAX_SIZE;
            } 
            else {
                printf(cptr->usage);
                return false;
            }
			if ((long)addr%FLASH_BLOCK_SIZE){
				printf("addr is not flash block base.\n");
				return false;
			}

		    // erase flash blocks.
		    printf("Erase flash blocks from 0x%08lx to 0x%08lx.\n", addr, (long)addr+len-1);
		    if (!EraseFlashBlocks((FUNIT *)addr, len)) return false;

		    printf("\tDone.\n");	
        
		    break;

			// "erase [addr] [len]".
	case 3 :
		// error.
		if (!HexToInt(argv[2], &len, 32)){
			printf(cptr->usage);
			return false;
		}
		if ((long)addr%FLASH_BLOCK_SIZE){
			printf("addr is not flash block base.\n");
			return false;
		}

		// erase flash blocks.
		end = addr + len;
		for (; addr<end; addr+=FLASH_BLOCK_SIZE){
			if (!EraseOneFlashBlock((FUNIT *)addr)) return false;
		}
		break;
	// error.
	default :
		printf(cptr->usage);
		return false;
		break;
	}
	return true;
}	// DoEraseOneFlashBlock.
Ejemplo n.º 22
0
bool DoWriteToFlashBlocks(CMD_TBL *cptr, int argc, char **argv)
{
	long	dest=0, src=0, len, wsize;
	
	switch (argc){
		case 2 :
			if (!StrCmp(argv[1], "kernel")){
				dest = (long)KERNEL_SRAM_BASE;
				src  = (long)KERNEL_DRAM_BASE;
				len  = (long)KERNEL_MAX_SIZE;
				printf("Saving kernel to flash...\n");
			}
			else if (!StrCmp(argv[1], "root")){
				dest = (long)ROOT_SRAM_BASE;
				src  = (long)ROOT_DRAM_BASE;
				len  = (long)ROOT_MAX_SIZE;
				printf("Saving root to flash...\n");
			}
			else if (!StrCmp(argv[1], "loader")){
				dest = (long)LOADER_SRAM_BASE;
				src  = (long)LOADER_DRAM_BASE;
				len  = (long)LOADER_MAX_SIZE;
				printf("Saving bootloader to flash...\n");
			}

			else {
				printf(cptr->usage);
				return false;	
			}
			break;
		// "flash [dest] [src] [len]".
		case 4 :
			if (!HexToInt(argv[1], &dest, 32) || !HexToInt(argv[2], &src, 32) ||
					!HexToInt(argv[3], &len, 32)){
				printf(cptr->usage);
				return false;
			}
			if (dest % FLASH_BLOCK_SIZE){
				printf("dest is not Flash Block Base.\n");
				return false;
			}
			break;
		default :
			printf(cptr->usage);
			return false;
			break;
	}

	// erase flash blocks.
	printf("Erase flash blocks from 0x%08lx to 0x%08lx.\n", dest, (long)dest+len-1);
	if (!EraseFlashBlocks((FUNIT *)dest, len)) return false;
	printf("\tDone.\n");

	// write to flash.
	printf("Write to flash...\n");

	wsize = FLASH_BLOCK_SIZE;

    do{
            printf("\tWriting at 0x%08lx...", (ulong)dest);
            if (!WriteToFlashBuffer((FUNIT *)dest, (FUNIT *)src)) break;

            dest += FLASH_BLOCK_SIZE;
            src += FLASH_BLOCK_SIZE;
			ClearLine();
    } while((len -= FLASH_BLOCK_SIZE) >0);

	printf("\tWriting at 0x%08lx\r\n", (ulong)dest);
	printf("\tDone\n");

	IT(dest) = FlashCMD(READ_ARRAY);	
	return true;
}	// DoWriteToFlashBlocks.
Ejemplo n.º 23
0
//---------------------------------------------------------------------------
char HexToChar(const UnicodeString & Hex, uintptr_t MinChars)
{
  return static_cast<char>(HexToInt(Hex, MinChars));
}
Ejemplo n.º 24
0
bool CTextReader::Open(const char* filename, Resolution res)
{
	_res = res;

	// Open the file
    FILE* file=fopen(filename,"rt");
	if (file==NULL)
	{
	    fprintf(stderr, "Could not open '%s' - %s (%i)\n", filename, strerror(errno), errno);
		return false;
	}

	// Parse the file
	parseState state = psReady;
	int ch;
	int pos=-1;
	bool ReadNextChar = true;
	int data;
	char buf[512];
	int bufPos=0;
	while ( !ReadNextChar || ((ch=fgetc(file)) >= 0) )
	{
		ReadNextChar = true;
		pos++;
		switch (state)
		{
			case psReady:
				switch (ch)
				{
					case '[':
						state = psComment;
						bufPos=0;
						break;

					case '/':
						state = psSlash;
						break;

					case '0':
						state = psLeadingZero;
						break;

					case '1':
						QueueBit(1);
						break;

					case 'S':
					case 'L':
					case '?':
					case '<':
					case '>':
						QueueCycleKind(ch);
						break;

					case ' ':
					case '\t':
					case '\n':
					case '\r':
						break;

					default:
						fprintf(stderr, "Error parsing input text file, unexpected character '%c' at %i\n", (char)ch, pos);
						fclose(file);
						return false;
				}
				break;

			case psComment:
				if (ch==']')
				{
					state = psReady;

					// Data format comment?
					if (strncmp(buf, "format:", 7)==0)
					{
						strcpy(_dataFormat, buf+7);
					}
				}
				else
				{
					if (bufPos+1 < sizeof(buf))
					{
						buf[bufPos++]=ch;
						buf[bufPos]='\0';
					}
				}

				break;

			case psSlash:
				if (ch=='/')
					state = psComment;
				else
				{
					fprintf(stderr, "Error parsing input text file, unexpected character '%c' at %i\n", (char)ch, pos);
					fclose(file);
					return false;
				}
				break;

			case psLineComment:
				if (ch=='\r' || ch=='\n')
				{
					state = psReady;
				}
				break;

			case psLeadingZero:
				if (ch=='x')
				{
					state = psHexHi;
				}
				else
				{
					QueueBit(0);
					state = psReady;
					ReadNextChar = false;
				}
						
				break;

			case psHexHi:
			case psHexLo:
				int nib = HexToInt(ch);
				if (nib<0)
				{
					fprintf(stderr, "Error parsing input text file, syntax error in hex byte unexpected '%c' at %i\n", (char)ch, pos);
					fclose(file);
					return false;
				}

				if (state==psHexHi)
				{
					data = nib << 4;
					state = psHexLo;
				}
				else
				{
					data |= nib;
					QueueByte(data);
					state = psReady;
				}
				break;
		}
	}

	fclose(file);

	if (state != psReady)
	{
		fprintf(stderr, "Error parsing input text file, unexpected EOF\n");
		return false;
	}
		
	// All good
	return true;
}
Ejemplo n.º 25
0
static int
ParseID( UBYTE* string,
         LONG*  manufacturer,
         WORD*  product,
         BYTE*  revision,
         LONG*  serial )
{
  int chars = 0;

  *manufacturer = ISAPNP_MAKE_ID( ToUpper( string[ 0 ] ),
                                  ToUpper( string[ 1 ] ),
                                  ToUpper( string[ 2 ] ) );

  *product      = ( HexToInt( string[ 3 ] ) << 8 ) |
                  ( HexToInt( string[ 4 ] ) << 4 ) |
                  ( HexToInt( string[ 5 ] ) );


  if( *product == -1 )
  {
    return 0;
  }

  *revision = HexToInt( string[ 6 ] );

  if( *revision == -1 )
  {
    return 0;
  }

  chars = 7;
  
  if( serial != NULL )
  {
    if( string[ 7 ] == '/' )
    {
      int conv = StrToLong( string + 8, serial );
      
      if( conv == -1 )
      {
        return 0;
      }
      else
      {
        chars += conv;
      }
    }
    else if( string[ 7 ] == 0 || string[ 7 ] != ' ' )
    {
      *serial = -1;
    }
    else
    {
      return 0;
    }
  }
  else
  {
    if( string[ 7 ] != 0 && string[ 7 ] != ' ' )
    {
      return 0;
    }
  }

  return chars;
}