示例#1
0
/*!
*/
xbShort xbDbf::PutLongField( xbShort FieldNo, xbLong Val )
{
  char buf[18];
  memset( buf, 0x00, 18 );
  sprintf( buf, "%ld", Val );
  return( PutField( FieldNo, buf ));
}
示例#2
0
/*!
*/
xbShort xbDbf::PutFloatField( xbShort FldNo, xbFloat f )
{
  char buf[25];
  char buf2[12];
  memset( buf, 0x00, 25 );
  memset( buf2, 0x00, 12 );
  sprintf( buf, "%d.%df", GetFieldLen( FldNo ), GetFieldDecimal( FldNo ));
  strcpy( buf2, "%-" );
  strcat( buf2, buf );
  sprintf( buf, buf2, f );

  /* remove trailing space */
  xbShort i = 0;
  while( i < 25 ) 
    if( buf[i] == 0x20 ){
      buf[i] = 0x00;
      break;
    } else
      i++;
  return PutField( FldNo, buf );
}
示例#3
0
//makes a guild member list packet (internal format), returns ownership of the buffer.
uint8 *ZoneGuildManager::MakeGuildMembers(uint32 guild_id, const char *prefix_name, uint32 &length) {
	uint8 *retbuffer;

	//hack because we dont have the "remove from guild" packet right now.
	if(guild_id == GUILD_NONE) {
		length = sizeof(Internal_GuildMembers_Struct);
		retbuffer = new uint8[length];
		Internal_GuildMembers_Struct *gms = (Internal_GuildMembers_Struct *) retbuffer;
		strcpy(gms->player_name, prefix_name);
		gms->count = 0;
		gms->name_length = 0;
		gms->note_length = 0;
		return(retbuffer);
	}

	std::vector<CharGuildInfo *> members;
	if(!GetEntireGuild(guild_id, members))
		return(nullptr);

	//figure out the actual packet length.
	uint32 fixed_length = sizeof(Internal_GuildMembers_Struct) + members.size()*sizeof(Internal_GuildMemberEntry_Struct);
	std::vector<CharGuildInfo *>::iterator cur, end;
	CharGuildInfo *ci;
	cur = members.begin();
	end = members.end();
	uint32 name_len = 0;
	uint32 note_len = 0;
	for(; cur != end; ++cur) {
		ci = *cur;
		name_len += ci->char_name.length();
		note_len += ci->public_note.length();
	}

	//calc total length.
	length = fixed_length + name_len + note_len + members.size()*2;	//string data + null terminators

	//make our nice buffer
	retbuffer = new uint8[length];

	Internal_GuildMembers_Struct *gms = (Internal_GuildMembers_Struct *) retbuffer;

	//fill in the global header
	strcpy(gms->player_name, prefix_name);
	gms->count = members.size();
	gms->name_length = name_len;
	gms->note_length = note_len;

	char *name_buf = (char *) ( retbuffer + fixed_length );
	char *note_buf = (char *) ( name_buf + name_len + members.size() );

	//fill in each member's entry.
	Internal_GuildMemberEntry_Struct *e = gms->member;

	cur = members.begin();
	end = members.end();
	for(; cur != end; ++cur) {
		ci = *cur;

		//the order we set things here must match the struct

//nice helper macro
#define SlideStructString(field, str) \
		strcpy(field, str.c_str()); \
		field += str.length() + 1
#define PutField(field) \
		e->field = ci->field

		SlideStructString( name_buf, ci->char_name );
		PutField(level);
		e->banker = ci->banker + (ci->alt * 2);	// low bit is banker flag, next bit is 'alt' flag.
		PutField(class_);
		PutField(rank);
		PutField(time_last_on);
		SlideStructString( note_buf, ci->public_note );
		e->zoneinstance = 0;
		e->zone_id = 0;	// Flag them as offline (zoneid 0) as world will update us with their online status afterwards.
#undef SlideStructString
#undef PutFieldN

		delete *cur;

		e++;
	}

	return(retbuffer);
}
示例#4
0
文件: xbmemo.cpp 项目: utech/UtechLib
/*!
  \param FieldNo
*/
xbShort xbDbf::DeleteMemoField( xbShort FieldNo )
{
  xbLong SBlockNo, SNoOfBlocks, SNextBlock;
  xbLong LastFreeBlock, LastFreeBlockCnt, LastDataBlock;
  xbShort rc;

  NextFreeBlock    = 0L;
  LastFreeBlockCnt = 0L;
  LastFreeBlock    = 0L;

  if( IsType3Dbt() ){    /* type III */
    PutField( FieldNo, "          " );
    return XB_NO_ERROR;
  }

  /* Get Block Number */
  if(( SBlockNo = GetLongField( FieldNo )) == 0 )
    return XB_INVALID_BLOCK_NO;

  /* Load the first block */

  if(( rc = ReadMemoBlock( SBlockNo, 4 )) != XB_NO_ERROR )
    return rc;

  if( (MFieldLen+2) % MemoHeader.BlockSize )
    SNoOfBlocks = (MFieldLen+2)/MemoHeader.BlockSize+1L;
  else
    SNoOfBlocks = (MFieldLen+2)/MemoHeader.BlockSize;

  /* Determine last good data block */
  LastDataBlock = CalcLastDataBlock();

  /* position to correct location in chain */
  NextFreeBlock = MemoHeader.NextBlock;
  while( SBlockNo > NextFreeBlock && SBlockNo < LastDataBlock ){
    LastFreeBlock    = NextFreeBlock;
    if(( rc = ReadMemoBlock( NextFreeBlock, 2 )) != XB_NO_ERROR )
      return rc;
    LastFreeBlockCnt = FreeBlockCnt;
  }


  /* if next block should be concatonated onto the end of this set */

  if((SBlockNo+SNoOfBlocks) == NextFreeBlock && NextFreeBlock < LastDataBlock )
  {
    if(( rc = ReadMemoBlock( NextFreeBlock, 2 )) != XB_NO_ERROR )
      return XB_NO_ERROR;
    SNoOfBlocks += FreeBlockCnt;
    SNextBlock = NextFreeBlock;
  } else if( LastFreeBlock == 0L )
    SNextBlock = MemoHeader.NextBlock;
  else
    SNextBlock = NextFreeBlock;

  /* if this is the first set of free blocks */
  if( LastFreeBlock == 0L ){
    /* 1 - write out the current block */
    /* 2 - update header block         */
    /* 3 - write header block          */
    /* 4 - update data field           */

    NextFreeBlock = SNextBlock;
    FreeBlockCnt = SNoOfBlocks;
    if(( rc = WriteMemoBlock( SBlockNo, 2 )) != XB_NO_ERROR )
      return rc;

    MemoHeader.NextBlock = SBlockNo;
    if(( rc = UpdateHeadNextNode()) != XB_NO_ERROR )
      return rc;
    PutField( FieldNo, "          " );
    return XB_NO_ERROR;
  }

/* determine if this block set should be added to the previous set */

  if(( LastFreeBlockCnt + LastFreeBlock ) == SBlockNo ){
    if(( rc = ReadMemoBlock( LastFreeBlock, 2 )) != XB_NO_ERROR )
      return rc;
    NextFreeBlock = SNextBlock;
    FreeBlockCnt += SNoOfBlocks;
    if(( rc = WriteMemoBlock( LastFreeBlock, 2 )) != XB_NO_ERROR )
      return rc;
    PutField( FieldNo, "          " );
    return XB_NO_ERROR;
  }

  /* insert into the chain */
  /* 1 - set the next bucket on the current node         */
  /* 2 - write this node                                 */
  /* 3 - go to the previous node                         */
  /* 4 - insert this nodes id into the previous node set */
  /* 5 - write previous node                             */

  FreeBlockCnt = SNoOfBlocks;
  if(( rc = WriteMemoBlock( SBlockNo, 2 )) != XB_NO_ERROR )
    return rc;
  if(( rc = ReadMemoBlock( LastFreeBlock, 2 )) != XB_NO_ERROR )
    return rc;
  NextFreeBlock = SBlockNo;
  if(( rc = WriteMemoBlock( LastFreeBlock, 2 )) != XB_NO_ERROR )
    return rc;
  PutField( FieldNo, "          " );

  return XB_NO_ERROR;
}
示例#5
0
u4 ExecutionEngine::Execute(Frame* pFrameStack)
{
    //ASSERT(pFrameStack);
	Frame* pFrame=&pFrameStack[0];
    //ASSERT(pFrame);

	u1 *bc=pFrame->pMethod->pCode_attr->code + pFrame->pc;	
	
	i4 error=0;
	JavaClass *pClass = pFrame->pClass;
    QString strMethod;
	pClass->GetStringFromConstPool(pFrame->pMethod->name_index, strMethod);

	i4 index=0;
    qint64 longVal;
	while(1)
	{		
		switch(bc[pFrame->pc])
		{
		case nop:
			pFrame->pc++;
			break;

		///////////////// Stack Operations ////////////////
		//Instructions that push a constant onto the stack
		case iconst_m1:
		case iconst_0:
		case iconst_1:
		case iconst_2:
		case iconst_3:
		case iconst_4:
		case iconst_5:
			pFrame->sp++;
			pFrame->stack[pFrame->sp].intValue = (u1)bc[pFrame->pc]-iconst_0; 
			pFrame->pc++;
			break;

		case aconst_null:			
			pFrame->sp++;
            pFrame->stack[pFrame->sp].object.index = 0;
			pFrame->pc++;				
			break;

		case lconst_0:// 9 /*(0x9)*/ 
		case lconst_1:// 10 /*(0xa)*/
			pFrame->sp++;
			pFrame->stack[pFrame->sp].intValue=0;
			pFrame->sp++;
			pFrame->stack[pFrame->sp].intValue=(u1)bc[pFrame->pc]-lconst_0;
			pFrame->pc++;				
			break;

		case bipush:// 16 /*(0x10)*/
			pFrame->sp++;
			pFrame->stack[pFrame->sp].charValue=(u1)bc[pFrame->pc+1];
			pFrame->pc+=2;
			break;
		case sipush:// 17 /*(0x11)*/
			pFrame->sp++;
			pFrame->stack[pFrame->sp].shortValue=getu2(&bc[pFrame->pc+1]);
			pFrame->pc+=3;
			break;

		case ldc: //Push item from constant pool 			
			pFrame->stack[++pFrame->sp] =LoadConstant(pFrame->pClass, (u1)bc[pFrame->pc+1]);
			pFrame->pc+=2;
			break;

		case ldc2_w:// 20 /*(0x14)*/
			index=getu2(&bc[pFrame->pc+1]);
			pFrame->sp++;
			pFrame->stack[pFrame->sp].intValue = getu4(&((char *)pClass->constant_pool[index])[1]);
			pFrame->sp++;
			pFrame->stack[pFrame->sp].intValue = getu4(&((char *)pClass->constant_pool[index])[5]);
			pFrame->pc += 3;
			break;

		//Instructions that load a local variable onto the stack
		case aload:// 25 /*(0x19)*/
			pFrame->sp++;
			pFrame->stack[pFrame->sp]=pFrame->stack[(u1)bc[pFrame->pc+1]];
			pFrame->pc+=2;
			break;

		case iload:// 21 /*(0x15)*/
			pFrame->sp++;
			pFrame->stack[pFrame->sp] = pFrame->stack[(u1)bc[pFrame->pc+1]]; 
			pFrame->pc+=2;
			break;
		case iload_0: //26 Load int from local variable 0 
		case iload_1: //27 Load int from local variable 1 
		case iload_2: //28 Load int from local variable 2 
		case iload_3: //29 Load int from local variable 3 
			pFrame->sp++;
			pFrame->stack[pFrame->sp] = pFrame->stack[(u1)bc[pFrame->pc]-iload_0]; 
			pFrame->pc++;			
			break;


		case lload:// 22 /*(0x16)*/

			break;
		case lload_0:// 30 /*(0x1e) */
		case lload_1:// 31 /*(0x1f) */
		case lload_2:// 32 /*(0x20) */
		case lload_3:// 33 /*(0x21) */
			pFrame->sp++;
			pFrame->stack[pFrame->sp]=pFrame->stack[(u1)bc[pFrame->pc]-lload_0];
			pFrame->sp++;
			pFrame->stack[pFrame->sp]=pFrame->stack[(u1)bc[pFrame->pc]-lload_0+1];
			pFrame->pc++;
			break;

		case fload_0: // 34 /*(0x22)*/ 
		case fload_1: // 35 /*(0x23) */
		case fload_2: // 36 /*(0x24) */
		case fload_3: // 37 /*(0x25)*/
			pFrame->sp++;
			pFrame->stack[pFrame->sp] = pFrame->stack[(u1)bc[pFrame->pc]-fload_0]; 
			pFrame->pc++;						
			break;		

		case aload_0:  //42 Load reference from local variable 0
		case aload_1:  //Load reference from local variable 1
		case aload_2:  //Load reference from local variable 2
		case aload_3:  //Load reference from local variable 3
			pFrame->sp++;
			pFrame->stack[pFrame->sp]= pFrame->stack[(u1)bc[pFrame->pc]-aload_0]; 
			DumpObject(pFrame->stack[pFrame->sp].object);
			pFrame->pc++;
			break;

		case iaload:// 46 /*(0x2e)*/Load int from array
			//..., arrayref, index  => ..., value
			pFrame->stack[pFrame->sp-1]=pObjectHeap->GetObjectPointer(pFrame->stack[pFrame->sp-1].object)[pFrame->stack[pFrame->sp].intValue+1];
			pFrame->sp--;
			pFrame->pc++;
			break;
		case aaload://50 
			//..., arrayref, index  ..., value
			pFrame->stack[pFrame->sp-1]=pObjectHeap->GetObjectPointer(pFrame->stack[pFrame->sp-1].object)[pFrame->stack[pFrame->sp].intValue+1];
			pFrame->sp--;
			pFrame->pc++;
			break;
		//Instructions that store a value from the stack into a local variable
		case astore:// 58 (0x3a)
			pFrame->stack[(u1)bc[pFrame->pc+1]]=pFrame->stack[pFrame->sp--];
			pFrame->pc+=2;
			break;

		case istore:// 54 /*(0x36)*/
			pFrame->stack[(u1)bc[pFrame->pc+1]]=pFrame->stack[pFrame->sp--];			
			pFrame->pc+=2;
			break;
		case istore_0: // 59 /*(0x3b)*/ 
		case istore_1: // 60 /*(0x3c) */
		case istore_2: // 61 /*(0x3d) */
		case istore_3: // 62 /*(0x3e)*/			
			pFrame->stack[(u1)bc[pFrame->pc]-istore_0]=pFrame->stack[pFrame->sp--];			
			pFrame->pc++;
			break;

		case lstore_0: // 63 /*(0x3f) */
		case lstore_1: // 64 /*(0x40) */
		case lstore_2: // 65 /*(0x41) */
		case lstore_3: // 66 /*(0x42) */
			pFrame->stack[(u1)bc[pFrame->pc]-lstore_0+1]=pFrame->stack[pFrame->sp--];
			pFrame->stack[(u1)bc[pFrame->pc]-lstore_0]=pFrame->stack[pFrame->sp--];
			pFrame->pc++;
			break;

		case fstore_0:
		case fstore_1:
		case fstore_2:
		case fstore_3:
			pFrame->stack[(u1)bc[pFrame->pc]-fstore_0]=pFrame->stack[pFrame->sp--];			
			pFrame->pc++;
			break;

		case astore_0:// 75 /*(0x4b) Store reference into local variable 0*/
		case astore_1:// 76 /*(0x4c) */
		case astore_2:// 77 /*(0x4d) */
		case astore_3:// 78 /*(0x4e)*/
			pFrame->stack[(u1)bc[pFrame->pc]-astore_0]=pFrame->stack[pFrame->sp--];			
			pFrame->pc++;
			break;

		case iastore:// 79 /*(0x4f)*/
		case aastore: // 83 - both seems same (TODO: Check it)
			pObjectHeap->GetObjectPointer(pFrame->stack[pFrame->sp-2].object)[pFrame->stack[pFrame->sp-1].intValue+1]=pFrame->stack[pFrame->sp];
			pFrame->sp-=3;
			pFrame->pc++;
			break;

		//Generic (typeless) stack operations

		case dup:// 89 /*(0x59)*/
			pFrame->stack[pFrame->sp+1]=pFrame->stack[pFrame->sp];
			pFrame->sp++;
			pFrame->pc++;
			break;
		case dup_x1:// 90 /*(0x5a)*/
			pFrame->stack[pFrame->sp+1]=pFrame->stack[pFrame->sp];
			pFrame->stack[pFrame->sp]=pFrame->stack[pFrame->sp-1];
			pFrame->stack[pFrame->sp-1]=pFrame->stack[pFrame->sp+1];
			pFrame->sp++;
			pFrame->pc++;
			break;
		case dup_x2:// 91 /*(0x5b)*/
			error=1;
			break;

		//Type Conversion

		//Integer Arithmetic 

		case iadd: //96
			pFrame->stack[pFrame->sp-1].intValue=pFrame->stack[pFrame->sp-1].intValue + pFrame->stack[pFrame->sp].intValue;	
			pFrame->sp--;
			pFrame->pc++;
			break;
		case ladd:// 97 /*(0x61)*/
            longVal = (qint64)(((qint64)pFrame->stack[pFrame->sp-3].intValue<<32) | (qint64)pFrame->stack[pFrame->sp-2].intValue)+(qint64)(((qint64)pFrame->stack[pFrame->sp-1].intValue<<32) | (qint64)pFrame->stack[pFrame->sp].intValue);
			pFrame->stack[pFrame->sp-3].intValue=HIINT64(longVal);
			pFrame->stack[pFrame->sp-2].intValue=LOINT64(longVal);
			pFrame->sp -= 2;
			pFrame->pc++;
			break;
		case isub: //100
			pFrame->stack[pFrame->sp-1].intValue=pFrame->stack[pFrame->sp-1].intValue - pFrame->stack[pFrame->sp].intValue;	
			pFrame->sp--;
			pFrame->pc++;			
			break;
		case imul://104
			pFrame->stack[pFrame->sp-1].intValue=pFrame->stack[pFrame->sp-1].intValue * pFrame->stack[pFrame->sp].intValue;	
			pFrame->sp--;
			pFrame->pc++;			
			break;

		case iinc:// 132 /*(0x84)*/ Increment local variable by constant
			pFrame->stack[(u1)bc[pFrame->pc+1]].intValue += (char)bc[pFrame->pc+2];
			pFrame->pc+=3;
			break;
		////////////////////// Logic ///////////////////
		
		//Shift operations

		//Bitwise boolean operations

		//Floating Point Arithmetic 



		/////////////// Objects and Arrays  ////////////

		//Instructions that deal with objects

		case _new:// 187 (0xbb)
			ExecuteNew(pFrame);
			pFrame->pc+=3;
			break;
		case putfield: //181 (0xb5): Set field in object
			PutField(pFrame);
			pFrame->sp-=2;
			pFrame->pc+=3;
			break;

		case getfield: //180 (0xb4) Fetch field from object
			GetField(pFrame);
			pFrame->pc+=3;
			break;

		//Instructions that deal with arrays

		case newarray:// 188 /*(0xbc)*/
			ExecuteNewArray(pFrame);
			pFrame->pc+=2;
			break;

		case anewarray: //189
			ExecuteANewArray(pFrame);
			pFrame->pc+=3;
			break;
		////////////// Control Flow /////////////////////

		//Conditional branch instructions

		case if_icmpeq: // 159 /*(0x9f) */
			if(pFrame->stack[pFrame->sp -1].intValue == pFrame->stack[pFrame->sp].intValue)
			{
				pFrame->pc+= geti2(&bc[pFrame->pc+1]);
			}
			else
			{
				pFrame->pc+=3;
			}
			pFrame->sp-=2;
			break;
		case if_icmpne: //160 /*(0xa0) */
			if(pFrame->stack[pFrame->sp -1].intValue != pFrame->stack[pFrame->sp].intValue)
			{
				pFrame->pc+= geti2(&bc[pFrame->pc+1]);
			}
			else
			{
				pFrame->pc+=3;
			}
			pFrame->sp-=2;
			break;
		case if_icmplt: // 161 /*(0xa1) */
			if(pFrame->stack[pFrame->sp -1].intValue < pFrame->stack[pFrame->sp].intValue)
			{
				pFrame->pc+= geti2(&bc[pFrame->pc+1]);
			}
			else
			{
				pFrame->pc+=3;
			}
			pFrame->sp-=2;
			break;
		case if_icmpge: // 162 /*(0xa2) */
			if(pFrame->stack[pFrame->sp -1].intValue >= pFrame->stack[pFrame->sp].intValue)
			{
				pFrame->pc+= geti2(&bc[pFrame->pc+1]);
			}
			else
			{
				pFrame->pc+=3;
			}
			pFrame->sp-=2;
			break;
		case if_icmpgt: // 163 /*(0xa3) */
			if(pFrame->stack[pFrame->sp -1].intValue > pFrame->stack[pFrame->sp].intValue)
			{
				pFrame->pc+= geti2(&bc[pFrame->pc+1]);
			}
			else
			{
				pFrame->pc+=3;
			}
			pFrame->sp-=2;
			break;
		case if_icmple: // 164 /*(0xa4)*/
			if(pFrame->stack[pFrame->sp -1].intValue <= pFrame->stack[pFrame->sp].intValue)
			{
				pFrame->pc+= geti2(&bc[pFrame->pc+1]);
			}
			else
			{
				pFrame->pc+=3;
			}
			pFrame->sp-=2;
			break;

		case ifeq:// 153 /*(0x99) */
			if(pFrame->stack[pFrame->sp].intValue == 0)
			{
				pFrame->pc+= geti2(&bc[pFrame->pc+1]);
			}
			else
			{
				pFrame->pc+=3;
			}
			pFrame->sp--;
			break;
		case ifne:// 154 /*(0x9a) */
			if(pFrame->stack[pFrame->sp].intValue != 0)
			{
				pFrame->pc+= geti2(&bc[pFrame->pc+1]);
			}
			else
			{
				pFrame->pc+=3;
			}
			pFrame->sp--;
			break;
		case iflt:// 155 /*(0x9b) */
			if(pFrame->stack[pFrame->sp].intValue < 0)
			{
				pFrame->pc+= geti2(&bc[pFrame->pc+1]);
			}
			else
			{
				pFrame->pc+=3;
			}
			pFrame->sp--;
			break;
		case ifge:// 156 /*(0x9c) */
			if(pFrame->stack[pFrame->sp].intValue >= 0)
			{
				pFrame->pc+= geti2(&bc[pFrame->pc+1]);
			}
			else
			{
				pFrame->pc+=3;
			}
			pFrame->sp--;
			break;
		case ifgt:// 157 /*(0x9d) */
			if(pFrame->stack[pFrame->sp].intValue > 0)
			{
				pFrame->pc+= geti2(&bc[pFrame->pc+1]);
			}
			else
			{
				pFrame->pc+=3;
			}
			pFrame->sp--;
			break;
		case ifle:// 158 /*(0x9e)*/
			if(pFrame->stack[pFrame->sp].intValue <= 0)
			{
				pFrame->pc+= geti2(&bc[pFrame->pc+1]);
			}
			else
			{
				pFrame->pc+=3;
			}
			pFrame->sp--;
			break;
		//Comparison instructions

		//Unconditional branch instructions
		case  _goto: // 167 /*(0xa7)*/
				pFrame->pc += geti2(&bc[pFrame->pc+1]);
			break;
		//Table jumping instructions

		////////////// Exceptions ///////////////////////
		case athrow:
			error =1;
			break;

		//////////////////////// Method Invocation and Return ////////

		//Method invocation instructions
		case invokespecial:
			ExecuteInvokeSpecial(pFrame);			
			pFrame->pc+=3;
			break;

		case invokevirtual: //182
			ExecuteInvokeVirtual(pFrame, invokevirtual);
			pFrame->pc+=3;
			break;

		case invokestatic:// 184 
			ExecuteInvokeVirtual(pFrame, invokestatic);
			pFrame->pc+=3;
			break;
		//Method return instructions
		case ireturn: //172 (0xac)			

			pFrame->stack[0].intValue=pFrame->stack[pFrame->sp].intValue;			
			return ireturn;
			break;

		case _return: //177 (0xb1): Return (void) from method			

			return 0;//METHOD_RETURN;
			break;
		//////////////// Thread Synchronization ////////////////////

		case monitorenter:// Enter and acquire object monitor 
		case monitorexit:// Release and exit object monitor
			error = 1;
			break;

		default:
			error=1;
			break;
		}

		if(error) break;
	}
	
    //ASSERT(!error);

	return 0;
}
示例#6
0
/*!
*/
xbShort xbDbf::PutField(const char *Name, const char *buf) {
  return PutField(GetFieldNo(Name), buf);
}