示例#1
0
文件: lang.cpp 项目: drodin/Crimson
int Locale::Load( MemBuffer &file ) {

  unsigned short langs = file.Read16();
  for ( int i = 0; i < langs; ++i ) {
    Language lang;
    int rc = lang.ReadCatalog( file );

    if ( rc >= 0 ) AddLanguage( lang );
    else return -1;
  }

  if ( lib.size() == 0 ) return -1;

  if ( !SetDefaultLanguage( CF_LANG_DEFAULT ) ) {
    // no english translation found, use something we have
    SetDefaultLanguage( lib.begin()->first );
  }

  return lib.size();
}
示例#2
0
void PackTmt::pack(OutputFile *fo)
{
    big_relocs = 0;

    Packer::handleStub(fi,fo,adam_offset);

    const unsigned usize = ih.imagesize;
    const unsigned rsize = ih.relocsize;

    ibuf.alloc(usize+rsize+128);
    obuf.allocForCompression(usize+rsize+128);

    MemBuffer wrkmem;
    wrkmem.alloc(rsize+EXTRA_INFO); // relocations

    fi->seek(adam_offset+sizeof(ih),SEEK_SET);
    fi->readx(ibuf,usize);
    fi->readx(wrkmem+4,rsize);
    const unsigned overlay = file_size - fi->tell();

    if (find_le32(ibuf,128,get_le32("UPX ")) >= 0)
        throwAlreadyPacked();
    if (rsize == 0)
        throwCantPack("file is already compressed with another packer");

    checkOverlay(overlay);

    unsigned relocsize = 0;
    //if (rsize)
    {
        for (unsigned ic=4; ic<=rsize; ic+=4)
            set_le32(wrkmem+ic,get_le32(wrkmem+ic)-4);
        relocsize = ptr_diff(optimizeReloc32(wrkmem+4,rsize/4,wrkmem,ibuf,1,&big_relocs), wrkmem);
    }

    wrkmem[relocsize++] = 0;
    set_le32(wrkmem+relocsize,ih.entry); // save original entry point
    relocsize += 4;
    set_le32(wrkmem+relocsize,relocsize+4);
    relocsize += 4;
    memcpy(ibuf+usize,wrkmem,relocsize);

    // prepare packheader
    ph.u_len = usize + relocsize;
    // prepare filter
    Filter ft(ph.level);
    ft.buf_len = usize;
    // compress
    upx_compress_config_t cconf; cconf.reset();
    // limit stack size needed for runtime decompression
    cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28 KiB stack
    compressWithFilters(&ft, 512, &cconf);

    const unsigned lsize = getLoaderSize();
    const unsigned s_point = getLoaderSection("TMTMAIN1");
    int e_len = getLoaderSectionStart("TMTCUTPO");
    const unsigned d_len = lsize - e_len;
    assert(e_len > 0  && s_point > 0);

    // patch loader
    linker->defineSymbol("original_entry", ih.entry);
    defineDecompressorSymbols();
    defineFilterSymbols(&ft);

    linker->defineSymbol("bytes_to_copy", ph.c_len + d_len);
    linker->defineSymbol("copy_dest", 0u - (ph.u_len + ph.overlap_overhead + d_len - 1));
    linker->defineSymbol("copy_source", ph.c_len + lsize - 1);
    //fprintf(stderr,"\nelen=%x dlen=%x copy_len=%x  copy_to=%x  oo=%x  jmp_pos=%x  ulen=%x  c_len=%x \n\n",
    //                e_len,d_len,copy_len,copy_to,ph.overlap_overhead,jmp_pos,ph.u_len,ph.c_len);

    linker->defineSymbol("TMTCUTPO", ph.u_len + ph.overlap_overhead);
    relocateLoader();

    MemBuffer loader(lsize);
    memcpy(loader,getLoader(),lsize);
    patchPackHeader(loader,e_len);

    memcpy(&oh,&ih,sizeof(oh));
    oh.imagesize = ph.c_len + lsize; // new size
    oh.entry = s_point; // new entry point
    oh.relocsize = 4;

    // write loader + compressed file
    fo->write(&oh,sizeof(oh));
    fo->write(loader,e_len);
    fo->write(obuf,ph.c_len);
    fo->write(loader+lsize-d_len,d_len); // decompressor
    char rel_entry[4];
    set_le32(rel_entry,5 + s_point);
    fo->write(rel_entry,sizeof (rel_entry));

    // verify
    verifyOverlappingDecompression();

    // copy the overlay
    copyOverlay(fo, overlay, &obuf);

    // finally check the compression ratio
    if (!checkFinalCompressionRatio(fo))
        throwNotCompressible();
}
示例#3
0
unsigned char * LoadPVRBuffer( const char * fileName, int & width, int & height )
{
	width = 0;
	height = 0;

	MemBufferFile bufferFile( fileName );

	MemBuffer buffer = bufferFile.ToMemBuffer( );

	if ( buffer.Length < ( int )( sizeof( OVR_PVR_HEADER ) ) )
	{
		LOG( "Invalid PVR file" );
		buffer.FreeData( );
		return NULL;
	}

	const OVR_PVR_HEADER & header = *( OVR_PVR_HEADER * )buffer.Buffer;
	if ( header.Version != 0x03525650 )
	{
		LOG( "Invalid PVR file version" );
		buffer.FreeData( );
		return NULL;
	}

	int format = 0;
	switch ( header.PixelFormat )
	{
 		case 578721384203708274llu:	format = Texture_RGBA;		break;
		default:
			LOG( "Unknown PVR texture format %llu, size %ix%i", header.PixelFormat, width, height );
			buffer.FreeData( );
			return NULL;
	}

	// skip the metadata
	const UInt32 startTex = sizeof( OVR_PVR_HEADER ) + header.MetaDataSize;
	if ( ( startTex < sizeof( OVR_PVR_HEADER ) ) || ( startTex >= buffer.Length ) )
	{
		LOG( "Invalid PVR header sizes" );
		buffer.FreeData( );
		return NULL;
	}

	size_t mipSize = GetOvrTextureSize( format, header.Width, header.Height );
	
	const int outBufferSizeBytes = buffer.Length - startTex;

	if ( mipSize > outBufferSizeBytes )
	{
		buffer.FreeData();
		return NULL;
	}

	width = header.Width;
	height = header.Height;

	// skip the metadata
	unsigned char * outBuffer = ( unsigned char * )malloc( outBufferSizeBytes );
	memcpy( outBuffer, ( unsigned char * )buffer.Buffer + startTex, outBufferSizeBytes );
	buffer.FreeData( );
	
	return outBuffer;
}
示例#4
0
void HtmlParser::outputHtmlNode(MemBuffer& buffer, const HtmlNode* pNode)
{
	int attributeIndex = 0;

	if(pNode == NULL)
		return;

	switch(pNode->type)
	{
	case NODE_CONTENT:
		if(pNode->flags & FLAG_CDATA_BLOCK)
		{
			buffer.appendText("<![CDATA[", 9);
			buffer.appendText(pNode->text);
			buffer.appendText("]]>", 3);
		}
		else
			buffer.appendText(pNode->text);
		break;
	case NODE_START_TAG:
		buffer.appendChar('<');
		buffer.appendText(pNode->tagName);
		if(pNode->attributeCount > 0)
			buffer.appendChar(' ');
		for(attributeIndex = 0; attributeIndex < pNode->attributeCount; attributeIndex++)
		{
			const HtmlAttribute* pAttribute = getAttribute(pNode, attributeIndex);
			buffer.appendText(pAttribute->name);
			if(pAttribute->value)
			{
				bool hasQuoteChar = (strchr(pAttribute->value, '\"') != NULL);
				buffer.appendChar('=');
				buffer.appendChar(hasQuoteChar ? '\'' : '\"');
				buffer.appendText(pAttribute->value);
				buffer.appendChar(hasQuoteChar ? '\'' : '\"');
			}
			if(attributeIndex < pNode->attributeCount - 1)
				buffer.appendChar(' ');
		}
		if(pNode->attributeCount == 0 && pNode->text) //比如 <!DOCTYPE ...>
		{
			buffer.appendChar(' ');
			buffer.appendText(pNode->text);
		}
		if(pNode->flags & FLAG_SELF_CLOSING_TAG)
			buffer.appendText(" /"); //自封闭
		buffer.appendChar('>');
		break;
	case NODE_END_TAG:
		buffer.appendText("</");
		buffer.appendText(pNode->tagName);
		buffer.appendChar('>');
		break;
	case NODE_REMARKS:
		buffer.appendText("<!--");
		buffer.appendText(pNode->text);
		buffer.appendText("-->");
		break;
	case NODE_UNKNOWN:
	default:
		fprintf(stderr, "HtmlParser.outputHtmlNode(): NODE_UNKNOWN\n");
		break;
	} //end switch
}
示例#5
0
void HtmlParser::parseExtraAttributes(const char* szAttributesText, HtmlNode* pTargetNode, const char* szNamePrefix)
{
	assert(pTargetNode);
	const char* p = szAttributesText;
	const char* ps = NULL;
	MemBuffer mem;

	bool inQuote1 = false, inQuote2 = false;
	unsigned char c;
	while(c = *p)
	{
		if(c == '\'')
			inQuote1 = !inQuote1;
		else if(c == '\"')
			inQuote2 = !inQuote2;

		bool notInQuote = (!inQuote1 && !inQuote2);

		if(notInQuote && (c == '\"' || c == '\'') && !isspace(p[1]))
		{
			//处理属性值引号后面没有空白分隔符的情况:a="v1"b=v2 (这种错误写法不少见,应兼容之)
			if(ps)
			{
				mem.appendPointer(duplicateStrAndUnquote(ps, p - ps + 1));
				ps = NULL;
			}
			p++;
			continue;
		}

		if(notInQuote && (c == '=' || isspace(c)))
		{
			if(ps)
			{
				mem.appendPointer(duplicateStrAndUnquote(ps, p - ps));
				ps = NULL;
			}
			if(c == '=')
				mem.appendPointer(NULL);
		}
		else
		{
			if(ps == NULL)
				ps = p;
		}

		p++;
	}

	if(ps)
		mem.appendPointer(duplicateStrAndUnquote(ps, p - ps));

	mem.appendPointer(NULL);
	mem.appendPointer(NULL);

	char** pp = (char**) mem.getData();

	//下面把解析出来的属性值存入pTargetNode->attributes

	MemBuffer* attributes = pTargetNode->attributes;
	if(attributes == NULL)
	{
		attributes = new MemBuffer();
		pTargetNode->attributes = attributes;
	}

	for(int i = 0, n = mem.getDataSize() / sizeof(char*) - 2; i < n; i++)
	{
		if(!szNamePrefix)
		{
			attributes->appendPointer(pp[i]); //attribute name
		} else {
			char* newAttributeName = duplicateStr(pp[i], -1, szNamePrefix);
			attributes->appendPointer(newAttributeName); //attribute name
			freeDuplicatedStr(pp[i]);
		}

		if(pp[i+1] == NULL)
		{
			attributes->appendPointer(pp[i+2]); //attribute value
			i += 2;
		}
		else
			attributes->appendPointer(NULL); //attribute vlalue

		//标记需free属性名称和属性值文本
		//TODO: 将来优化到尽量少复制文本
		attributes->appendInt(FLAG_NEED_FREE_NAME | FLAG_NEED_FREE_VALUE); //attribute flags
	}

	attributes->shrink();
	pTargetNode->attributeCount = attributes->getDataSize() / sizeof(HtmlAttribute);
}
示例#6
0
文件: p_wcle.cpp 项目: tfauck/upx
void PackWcle::decodeFixups()
{
    upx_byte *p = oimage + soimage;

    iimage.dealloc();

    MemBuffer tmpbuf;
    unsigned fixupn = unoptimizeReloc32(&p,oimage,&tmpbuf,1);

    MemBuffer wrkmem(8*fixupn+8);
    unsigned ic,jc,o,r;
    for (ic=0; ic<fixupn; ic++)
    {
        jc=get_le32(tmpbuf+4*ic);
        set_le32(wrkmem+ic*8,jc);
        o = soobject_table;
        r = get_le32(oimage+jc);
        virt2rela(oobject_table,&o,&r);
        set_le32(wrkmem+ic*8+4,OOT(o-1,my_base_address));
        set_le32(oimage+jc,r);
    }
    set_le32(wrkmem+ic*8,0xFFFFFFFF);     // end of 32-bit offset fixups
    tmpbuf.dealloc();

    // selector fixups and self-relative fixups
    const upx_byte *selector_fixups = p;
    const upx_byte *selfrel_fixups = p;

    while (*selfrel_fixups != 0xC3)
        selfrel_fixups += 9;
    selfrel_fixups++;
    unsigned selectlen = ptr_diff(selfrel_fixups, selector_fixups)/9;

    ofixups = New(upx_byte, fixupn*9+1000+selectlen*5);
    upx_bytep fp = ofixups;

    for (ic = 1, jc = 0; ic <= opages; ic++)
    {
        // self relative fixups
        while ((r = get_le32(selfrel_fixups))/mps == ic-1)
        {
            fp[0] = 8;
            set_le16(fp+2,r & (mps-1));
            o = 4+get_le32(oimage+r);
            set_le32(oimage+r,0);
            r += o;
            o = soobject_table;
            virt2rela(oobject_table,&o,&r);
            fp[4] = (unsigned char) o;
            set_le32(fp+5,r);
            fp[1] = (unsigned char) (r > 0xFFFF ? 0x10 : 0);
            fp += fp[1] ? 9 : 7;
            selfrel_fixups += 4;
            dputc('r',stdout);
        }
        // selector fixups
        while (selectlen && (r = get_le32(selector_fixups+5))/mps == ic-1)
        {
            fp[0] = 2;
            fp[1] = 0;
            set_le16(fp+2,r & (mps-1));
            unsigned x = selector_fixups[1] > 0xD0 ? oh.init_ss_object : oh.init_cs_object;
            fp[4] = (unsigned char) x;
            fp += 5;
            selector_fixups += 9;
            selectlen--;
            dputc('s',stdout);
        }
        // 32 bit offset fixups
        while (get_le32(wrkmem+4*jc) < ic*mps)
        {
            if (jc > 1 && ((get_le32(wrkmem+4*(jc-2))+3) & (mps-1)) < 3) // cross page fixup?
            {
                r = get_le32(oimage+get_le32(wrkmem+4*(jc-2)));
                fp[0] = 7;
                fp[1] = (unsigned char) (r > 0xFFFF ? 0x10 : 0);
                set_le16(fp+2,get_le32(wrkmem+4*(jc-2)) | ~3);
                set_le32(fp+5,r);
                o = soobject_table;
                r = get_le32(wrkmem+4*(jc-1));
                virt2rela(oobject_table,&o,&r);
                fp[4] = (unsigned char) o;
                fp += fp[1] ? 9 : 7;
                dputc('0',stdout);
            }
            o = soobject_table;
            r = get_le32(wrkmem+4*(jc+1));
            virt2rela(oobject_table,&o,&r);
            r = get_le32(oimage+get_le32(wrkmem+4*jc));
            fp[0] = 7;
            fp[1] = (unsigned char) (r > 0xFFFF ? 0x10 : 0);
            set_le16(fp+2,get_le32(wrkmem+4*jc) & (mps-1));
            fp[4] = (unsigned char) o;
            set_le32(fp+5,r);
            fp += fp[1] ? 9 : 7;
            jc += 2;
        }
        set_le32(ofpage_table+ic,ptr_diff(fp,ofixups));
    }
    for (ic=0; ic < FIXUP_EXTRA; ic++)
        *fp++ = 0;
    sofixups = ptr_diff(fp, ofixups);
}
EVENT emul::menu_main()
{
	int menuExit = 0;
	static int menufocus = 0;
	EVENT action = EVENT_NONE;

	system::set_cpu_speed(CPU_SPEED_IN_MENU);
	system::init_frames_counter(100);
	video::init(VM_FAST);

	menu::setup_bg_scrolling();
	menu::msg_box("Please wait...", MMB_MESSAGE);
	
	//  Prepare states screenshots
	MemBuffer currState;
	printf("SAVE CURRENT STATE TO TEMPORARY BUFFER\n");
	core::save_load_state(NULL, &currState, false);                             //  save current state to memory
	_get_state_screenshot(stateCurrent);                                        //  get screenshot for current state
	if(slotNumber < 0)
	{
		slotNumber = 0;
		printf("LOAD STATE FROM SLOT 0\n");
		core::save_load_state(mSaveState[slotNumber].filePath, NULL, true); 	//  load selected slot state
		_get_state_screenshot(stateSaved);                                      //  get screenshot for selected slot state
		printf("RESTORE CURRENT STATE FROM TEMPORARY BUFFER\n");
		core::save_load_state(NULL, &currState, true);                          //  restore current state
	}

	//  Begin menu loop
	menu::open();
	_update_text_menu_main();
	while (!menuExit)
	{
		// Draw screen:
		video::bind_framebuffer();
		menu::select_bg_texture(true);
		menu::render_menu(MM_count, menufocus);
		bool showSavedState = (menufocus == MM_SAVE_STATE || menufocus == MM_LOAD_STATE) && !settings.oldSchoolMode;
		menu::render_stateshot(
			HW_SCREEN_WIDTH - 8 - SCREENSHOT_WIDTH, 32, SCREENSHOT_WIDTH, SCREENSHOT_HEIGHT,
			showSavedState ? (mSaveState[slotNumber].inUse ? 2 : 1) : 0, slotNumber, stateCurrent, stateSaved);
		menu::select_bg_texture(false);
		video::term_framebuffer();
		video::flip(0);
		
		switch(menu::update(MM_count, menufocus))
		{
			case MA_CANCEL:
				action = EVENT_RUN_ROM;
				menuExit = 1;
				break;

			case MA_DECREASE:
				switch(menufocus)
				{
					case MM_SAVE_STATE:
					case MM_LOAD_STATE:
						if(--slotNumber < 0) slotNumber = 9;
						if(mSaveState[slotNumber].inUse) {
							core::save_load_state(mSaveState[slotNumber].filePath, NULL, true);
							_get_state_screenshot(stateSaved);
							core::save_load_state(NULL, &currState, true);
						}
						break;
					case MM_SKIP_FRAMES:
						if(--settings.frameSkip > 6) settings.frameSkip = 6;
						break;
					case MM_FULLSCREEN:
						settings.fullScreen ^= 1;
						break;
					case MM_SOUND_VOLUME:
						if(--settings.soundVolume > 10) settings.soundVolume = 10;
						break;
				}
				_update_text_menu_main();
				break;

			case MA_INCREASE:
				switch(menufocus)
				{
					case MM_SAVE_STATE:
					case MM_LOAD_STATE:
						if(++slotNumber > 9) slotNumber = 0;
						if(mSaveState[slotNumber].inUse) {
							core::save_load_state(mSaveState[slotNumber].filePath, NULL, true);
							_get_state_screenshot(stateSaved);
							core::save_load_state(NULL, &currState, true);
						}
						break;
					case MM_SKIP_FRAMES:
						if(++settings.frameSkip > 6) settings.frameSkip = 0;
						break;
					case MM_FULLSCREEN:
						settings.fullScreen ^= 1;
						break;
					case MM_SOUND_VOLUME:
						if(++settings.soundVolume > 10) settings.soundVolume = 0;
						break;
				}
				_update_text_menu_main();
				break;

			case MA_SELECT:
				switch(menufocus)
				{
					case MM_RESUME:
						action = EVENT_RUN_ROM;
						menuExit = 1;
						break;
					case MM_SAVE_STATE:
						menu::msg_box("Save game state...", MMB_MESSAGE);
						core::save_load_state(mSaveState[slotNumber].filePath, NULL, false);
						mSaveState[slotNumber].inUse = true;
						memcpy(stateSaved, stateCurrent, sizeof(stateCurrent));
						break;
					case MM_LOAD_STATE:
						core::save_load_state(mSaveState[slotNumber].filePath, NULL, true);
						action = EVENT_RUN_ROM;
						menuExit = 1;
						break;
#ifndef DISABLE_CHEATING
					case MM_CHEATING:
						menu_cheating();
						break;
#endif 
					case MM_SKIP_FRAMES:
						settings.frameSkip = 0;
						break;
					case MM_SOUND_VOLUME:
						settings.soundVolume = 0;
						break;
					case MM_ADVANCED_SETS:
						menu_advanced();
						break;
					case MM_RESET:
						if(menu::msg_box("Are you sure want to reset the game?", MMB_YESNO))
						{
							action = EVENT_RESET_ROM;
							menuExit = 1;
						}
						break;
					case MM_EXIT:
						action = EVENT_EXIT_APP;
						menuExit = 1;
						break;
				}
				_update_text_menu_main();
				break;
				
			case MA_NONE:
				if(menufocus == MM_SAVE_STATE || menufocus == MM_LOAD_STATE)
				{
					if((input::poll() & HW_INPUT_X) && mSaveState[slotNumber].inUse)
					{
						char buf[256]; sprintf(buf, "Are you really want to delete the game state from the \"Slot %d\"?", slotNumber);
						if(menu::msg_box(buf, MMB_YESNO))
						{
							fsys::kill(mSaveState[slotNumber].filePath);
							mSaveState[slotNumber].inUse = false;                           
						}
						_update_text_menu_main();
					}
				}
				break;
		}
	}
	menu::close();

	//  Free used heap memory
	printf("FREE CURRENT STATE TEMPORARY BUFFER\n");
  	currState.free();

	return action;
}
示例#8
0
static int test_MemBuffer (){
    cout << "Go Testing" << __FILE__ << endl;

    MemBuffer mem;

    cout << "default capacity:" << mem.capacity () << endl;

    mem.require (512);
    cout << "now capacity:" << mem.capacity () << endl;

    mem.require (513);
    cout << "now capacity:" << mem.capacity () << endl;

    cout << "not use=>" << mem.data () << endl;
    mem.appendData ("hello", 5);
    cout << "=>" << ( mem.data ()!=NULL?(char*) mem.data (): NULL) << endl;

    mem.appendData (" world", 6);
    cout << "=>" << ( mem.data ()!=NULL?(char*) mem.data (): NULL) << endl;

    cout << "now size:" << mem.size () << " capacity:" << mem.capacity () << endl;
    mem.shrink ();
    cout << "now size:" << mem.size () << " capacity:" << mem.capacity () << endl;

    mem.insertData (6, "code ", 5);
    cout << "inserted size:" << mem.size () << " capacity:" << mem.capacity () << endl;
    cout << "=>" << ( mem.data ()!=NULL?(char*) mem.data (): NULL) << endl;

    mem.deleteData (6, 5);
    cout << "deleted size:" << mem.size () << " capacity:" << mem.capacity () << endl;
    cout << "=>" << ( mem.data ()!=NULL?(char*) mem.data (): NULL) << endl;

    MemBuffer other;
    other = mem;
    cout << "other size:" << other.size () << " capacity:" << other.capacity () << endl;
    cout << "other=>" << ( other.data ()!=NULL?(char*) other.data (): NULL) << endl;

    size_t rs = other.saveToFile ("/tmp/temp_test");
    cout << "write :" << rs << endl;

    mem.empty ();
    rs = mem.loadFromFile ("/tmp/temp_test");
    cout << "read :" << rs << endl;
    cout << "read size:" << mem.size () << " capacity:" << mem.capacity () << endl;
    cout << "=>" << ( mem.data ()!=NULL?(char*) mem.data (): NULL) << endl;
    unlink ("/tmp/temp_test");

    cout << "=============================\n\n" << endl;
    int i = 1;
    long l = 1000;
    char string[] = "hello world";
    bool b = true;
    float f = 2.0f;
    double d = 100.1;


    mem.empty ();


    mem.pushInt ( &i );
    mem.pushLong ( &l );
    mem.pushString ( string, strlen(string) );
    mem.pushBool ( &b );
    mem.pushFloat ( &f );
    mem.pushDouble ( &d );
cout << "push size:" << mem.size () << " capacity:" << mem.capacity () << endl;

    other.empty ();
    other = mem;

    cout << "double:" << other.popDouble () << endl;
    cout << "float:" << other.popFloat () << endl;
    cout << "bool:" << other.popBool () << endl;
    cout << "stirng:" << other.popString () << endl;
    cout << "loing:" << other.popLong () << endl;
    cout << "int:" << other.popInt () << endl;

    return 0;
}
示例#9
0
int Transport::Save( MemBuffer &file ) const {
  Unit::Save( file );
  file.Write16( t_crystals );
  return 0;
}
示例#10
0
void MemBuffer::copy(const MemBuffer& buffer)
{
	int size = buffer.getSize();
	alloc(size);
	memcpy(getPtr(), buffer.getConstPtr(), size);
}