Beispiel #1
0
mword *tptr_find_tag(bvm_cache *this_bvm, mword *search_bs, mword *tag){  // tptr_find_tag#

    if(is_nil(search_bs) || is_nil(tag)){
        return nil;
    }

    mword *search_tag;

    if(is_tptr(tag)){
        search_tag = tag;
    }
    else{
        search_tag = tptr_new(this_bvm, tag, nil);
    }

    mword *sub_list = bstruct_find(this_bvm, search_bs, search_tag);
    mword *result = nil;

    while(!is_nil(sub_list)){
        result = _cons(this_bvm, rci(rci(sub_list,0),0), result);
        sub_list = (mword*)icdr(sub_list);
    }

    return result;

}
Beispiel #2
0
DSN_API void dsn_file_copy_remote_files(dsn_address_t remote, const char* source_dir, const char** source_files, const char* dest_dir, bool overwrite, dsn_task_t cb)
{
    std::shared_ptr< ::dsn::remote_copy_request> rci(new ::dsn::remote_copy_request());
    rci->source = remote;
    rci->source_dir = source_dir;

    rci->files.clear();
    const char** p = source_files;
    while (*p != nullptr && **p != '\0')
    {
        rci->files.push_back(std::string(*p));
        p++;

        dinfo("copy remote file %s from %s", 
            *(p-1),
            rci->source.to_string()
            );
    }

    rci->dest_dir = dest_dir;
    rci->overwrite = overwrite;

    ::dsn::aio_task* callback((::dsn::aio_task*)cb);

    ::dsn::task::get_current_nfs()->call(rci, callback);
}
Beispiel #3
0
void QSegmentWidget::DrawCylinder(const Cylinder &cyl,
  const SegmentList &s, const bool erase)
{
  if (!m_pixmap)
    InitPixmap();
  qreal border = 0;
  QPainter painter(m_pixmap);
  painter.setRenderHint(QPainter::Antialiasing);
  painter.setRenderHint(QPainter::SmoothPixmapTransform);
  painter.setWindow( -(BM_OSIZE / 2), -(BM_OSIZE / 2),
    BM_OSIZE, BM_OSIZE);
  QRectF rco(-cyl.outerRadius, -cyl.outerRadius, (cyl.outerRadius * 2.0)+border,
      (cyl.outerRadius * 2.0)+border);
  QRectF rci(-cyl.innerRadius, -cyl.innerRadius, (cyl.innerRadius * 2.0)+border,
      (cyl.innerRadius * 2.0)+border);
  QRegion ro(rco.toRect(), QRegion::Rectangle);
  QRegion ri(rci.toRect(), QRegion::Ellipse);
  QRegion region = ro.subtracted(ri);
  painter.setClipRegion(region);
  if (erase) {
      painter.setBrush(Qt::NoBrush);
      painter.setPen(Qt::NoPen);
  } else {
    QBrush b(cyl.color);
    painter.setBrush(b);
    painter.setPen(QPen(cyl.color.darker(200),border));
  }
  DrawSegments(&painter, s, cyl.outerRadius);
}
Beispiel #4
0
mword is_false_inte(mword *bs){ // is_false_inte#

    int i;
    for(i=0;i<size(bs);i++){
        if(!is_nil(rci(bs,i))){
            return 0;
        }
    }

    return 1;

}
Beispiel #5
0
void CGfxPopupMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
//	lpMeasureItemStruct->itemWidth = 200;
//	lpMeasureItemStruct->itemHeight = 25;
	bool res = false;
	if (lpMeasureItemStruct->CtlType == ODT_MENU)
	{
		UINT id = lpMeasureItemStruct->itemID;

		SpawnItem * pItem = (SpawnItem *) lpMeasureItemStruct->itemData;
		if (pItem)
		{
			if (pItem->iCmd == -3) // is a separator
			{
				lpMeasureItemStruct->itemWidth  = 10;
				lpMeasureItemStruct->itemHeight = 6;
			}
			else
			{
				CString cs(pItem->cText);
				if (!cs.IsEmpty())
				{
					CClientDC dc(AfxGetMainWnd());
					CFont * pft = CFont::FromHandle(hMenuFont ? hMenuFont : hGuiFont);
					CFont * of = dc.SelectObject(pft);
					CSize osz = dc.GetOutputTabbedTextExtent(cs,0,NULL);
					if (pItem->iCmd == -4)
					{
						CRect rci(0,0,0,0);
						dc.DrawText(cs, rci, DT_CALCRECT|DT_TOP|DT_VCENTER|DT_SINGLELINE);
						lpMeasureItemStruct->itemHeight = rci.Height();
						lpMeasureItemStruct->itemWidth = rci.Width();
					}
					else
					{
						lpMeasureItemStruct->itemHeight = szImage.cy + 5;
						if (osz.cy > (int) lpMeasureItemStruct->itemHeight) lpMeasureItemStruct->itemHeight = (int) osz.cy;
						lpMeasureItemStruct->itemWidth  = osz.cx + 2 + 15;
						lpMeasureItemStruct->itemWidth += lpMeasureItemStruct->itemHeight > (UINT) szImage.cx ? (UINT) lpMeasureItemStruct->itemHeight : (UINT) szImage.cx;
					}
					dc.SelectObject(of);
				}
				else
				{
					lpMeasureItemStruct->itemHeight = szImage.cy + 5;
					lpMeasureItemStruct->itemWidth  = 100;
				}
			}
		}
	}
}
Beispiel #6
0
DSN_API void dsn_file_copy_remote_directory(dsn_address_t remote, const char* source_dir, 
    const char* dest_dir, bool overwrite, dsn_task_t cb)
{
    std::shared_ptr< ::dsn::remote_copy_request> rci(new ::dsn::remote_copy_request());
    rci->source = remote;
    rci->source_dir = source_dir;
    rci->files.clear();
    rci->dest_dir = dest_dir;
    rci->overwrite = overwrite;

    ::dsn::aio_task* callback((::dsn::aio_task*)cb);

    ::dsn::task::get_current_nfs()->call(rci, callback);
}
Beispiel #7
0
mword *_babel_root(bvm_cache *this_bvm, mword *loaded_bvm){ // _babel_root#

#ifdef BABEL_RESET_TRACE
_trace;
#endif

    bvm_cache new_bvm;
    bvm_cache *new_bvm_ptr = &new_bvm;

    cache_new(this_bvm, new_bvm_ptr, loaded_bvm);

    mword *bvm_initd = rci(cache_read_from_bvm(this_bvm, BABEL_SYM_BVM_INITD),0);

    if(!rcl(bvm_initd,0)){
        bvm_new(new_bvm_ptr);
        lcl(bvm_initd,0) = 1;
    }
    else{
        cache_update(new_bvm_ptr);
    }

    new_bvm_ptr->flags->BVM_CACHE_DIRTY   = FLAG_CLR;
    new_bvm_ptr->flags->BVM_CACHE_INVALID = FLAG_CLR;

    babel_root_code_injection_point(new_bvm_ptr);

    new_bvm_ptr->flags->BVM_CODE_LIST_EMPTY = FLAG_CLR;

    interp_core(new_bvm_ptr);

    this_bvm->flags->BVM_CACHE_DIRTY   = FLAG_CLR;
    this_bvm->flags->BVM_CACHE_INVALID = FLAG_CLR;

// XXX Enhancement: handle return-from-root
//    if(new_bvm_ptr->flags->BVM_CODE_LIST_EMPTY == FLAG_SET){
//        _msg("BVM_CODE_LIST_EMPTY");
//    }

    return nil;

}
CL_Error CL_RIFFImage::Locate(char const * iname, int const enum_id)
{
	_LOGPRINT(("RIF File image finder called for %s, id %d\n",iname,enum_id));
	
	if (!Env_Chunk)
		_LOGPUT("WARNING! no .RIF file loaded\n");
	
	if (!Env_Chunk) return CLE_RIFFERROR;

	switch (imode)
	{
		case CLM_ATTACHEDPALETTE:
		case CLM_16BIT:
		case CLM_24BIT:
		case CLM_32BIT:
		case CLM_GLOBALPALETTE:
		case CLM_TLTPALETTE:
			break;
		default:
			_LOGPUT("WARNING! undefined video mode\n");
			return CLE_INVALIDDXMODE;
	}

	// remove projectsubdirectory from start of image name if it is there
	unsigned int const psdirlen = strlen(projectsubdirectory);
	if (!strncmp(projectsubdirectory,iname,psdirlen))
	iname += psdirlen;
	
	List<Chunk *> envdl (Env_Chunk->lookup_child("REBENVDT"));

	if (!envdl.size())
	{
		_LOGPUT("WARNING! no environment data chunk\n");
		return CLE_RIFFERROR;
	}

	Environment_Data_Chunk * envd = (Environment_Data_Chunk *) envdl.first_entry();

	CL_Error retval = CLE_OK;
	Environment_Game_Mode_Chunk * egmc = 0;
	if (game_mode)
	{
		if (*game_mode)
		{
			List<Chunk *> egmcl (envd->lookup_child("GAMEMODE"));

			for (LIF<Chunk *> egmci(&egmcl); !egmci.done(); egmci.next())
			{
				Environment_Game_Mode_Chunk * egmcm = (Environment_Game_Mode_Chunk *) egmci();
				if (egmcm->id_equals(game_mode))
				{
					egmc = egmcm;
					break;
				}
			}

			if (!egmc) retval = CLE_INVALIDGAMEMODE;
				// only returns this error if the game mode cannot be found *and* the image is not listed
		}
	}

	if (name)
	{
		delete[] name;
		name = 0;
	}
	if (iname) name = strip_file_extension(strip_path(iname));

	char * rcname = 0;
	if (iname)
	{
		if (strchr(iname,'\\'))
		{
			rcname = new char[strlen(iname)+1];
			strcpy(rcname,iname);
			*strchr(rcname,'\\')=0;
		}
		else if (strchr(iname,'/'))
		{
			rcname = new char[strlen(iname)+1];
			strcpy(rcname,iname);
			*strchr(rcname,'/')=0;
		}
	}

	if (egmc)
	{
		int shapefoundingm = rcname ? 0 : 1;
		// Get the matching image 'Processor' chunk
		List<Chunk *> micl = egmc->lookup_child("MATCHIMG");

		Matching_Images_Chunk * mic = 0;
		if (micl.size()) mic = (Matching_Images_Chunk *)micl.first_entry();
		
		List<Chunk *> rcl = egmc->lookup_child("RIFCHILD");

		for (LIF<Chunk *> rci(&rcl); !rci.done(); rci.next())
		{
			RIF_Child_Chunk * rcm = (RIF_Child_Chunk *) rci();

			if (rcname)
			{
				if (_stricmp(rcname,rcm->rifname) && (*rcname || *rcm->filename))
					continue;
				shapefoundingm = 1;
			}

			for (LIF<BMP_Flags> bmpfi(&rcm->bmps); !bmpfi.done(); bmpfi.next())
			{
				BMP_Flags bmpft(bmpfi());
				strip_file_extension(bmpft.filename);

				if (iname ? !_stricmp(name,strip_path(bmpft.filename)) : enum_id == bmpft.enum_id)
				{
					// select image descriptor
					ImageDescriptor const idsc
						(
							*rcm->filename ? 
								(IDscFlags)((bmpft.flags & ChunkBMPFlag_FixedPalette ?
									IDSCF_FIXEDPALETTE
								:
									IDSCF_0)
								|IDSCF_INCLUDED)
							:
								IDSCF_0,
							bmpfi().filename,
							*rcm->filename ? rcm->rifname : 0
						);
					ImageDescriptor const * p_idsc = &idsc;

					if (mic) p_idsc = &mic->GetLoadImage(idsc);
					else _LOGPRINT(("WARNING! no rule to find matching images in game mode %s\n",egmc->header->mode_identifier));

					// load this image
					GetPath(*p_idsc,envd,bmpft.flags);

					if (fname)
					{
						if (rcname)
						{
							delete[] rcname;
							rcname = 0;
						}
						flags.located = 1;
						return CLE_OK;
					}
				}
			}
		}
		
		List<Chunk *> ssc = egmc->lookup_child("SHBMPNAM");

		for (LIF<Chunk *> ssi(&ssc); !ssi.done(); ssi.next())
		{
			External_Shape_BMPs_Store_Chunk * ss = (External_Shape_BMPs_Store_Chunk *) ssi();

			if (rcname)
				if (_stricmp(rcname,ss->shapename) && *rcname)
					continue;

			for (LIF<BMP_Name> bmpfi(&ss->bmps); !bmpfi.done(); bmpfi.next())
			{
				BMP_Name bmpft(bmpfi());
				strip_file_extension(bmpft.filename);

				if (iname ? !_stricmp(name,strip_path(bmpft.filename)) : enum_id == bmpft.enum_id)
				{

					// select image descriptor
					ImageDescriptor const idsc
						(
							(IDscFlags)((bmpft.flags & ChunkBMPFlag_FixedPalette ?
								IDSCF_FIXEDPALETTE
							:
								IDSCF_0)
							|(ss->GetExtendedData()->flags & GBF_SPRITE ?
								IDSCF_SPRITE
							:
								IDSCF_SUBSHAPE)
							|IDSCF_INCLUDED),
							bmpfi().filename,
							ss->shapename,
							bmpft.flags & ChunkBMPFlag_FixedPalette ? ss->rifname : 0
						);
					ImageDescriptor const * p_idsc = &idsc;

					if (mic) p_idsc = &mic->GetLoadImage(idsc);
					else _LOGPRINT(("WARNING! no rule to find matching images in game mode %s\n",egmc->header->mode_identifier));

					#if TRY_OLD_DIRS // temporary until all textures move to SubShps/All directory
					if (*p_idsc == idsc)
					{
						// select image descriptor
						ImageDescriptor const idsc2
							(
								(IDscFlags)((bmpft.flags & ChunkBMPFlag_FixedPalette ?
									IDSCF_FIXEDPALETTE
								:
									IDSCF_0)
								|(ss->GetExtendedData()->flags & GBF_SPRITE ?
									IDSCF_SPRITE
								:
									IDSCF_0)
								|IDSCF_INCLUDED),
								bmpfi().filename,
								ss->shapename,
								bmpft.flags & ChunkBMPFlag_FixedPalette ? ss->rifname : 0
							);
						ImageDescriptor const * p_idsc2 = &idsc2;

						if (mic) p_idsc2 = &mic->GetLoadImage(idsc2);
						else _LOGPRINT(("WARNING! no rule to find matching images in game mode %s\n",egmc->header->mode_identifier));

						if (*p_idsc2 != idsc2)
						{
							_LOGPUT("WARNING! Not listed as in SubShps directory\n");
							p_idsc = p_idsc2;
						}
					}
					#endif

					// load this image
					GetPath(*p_idsc,envd,bmpft.flags);
					
					if (fname)
					{
						if (rcname)
						{
							delete[] rcname;
							rcname = 0;
						}
						flags.located = 1;
						return CLE_OK;
					}
				}
			}
		}
		
		if (rcname)
		{
			if (!shapefoundingm)
				_LOGPRINT(("WARNING! shape/sprite %s not found in this RIF file\n",rcname));
			else
				_LOGPRINT(("WARNING! shape/sprite %s does not appear to list %s\n",rcname,name));
		}

	}

	List<Chunk *> micl = envd->lookup_child("MATCHIMG");
	
	Matching_Images_Chunk * mic_fix = 0;
	Matching_Images_Chunk * mic_nrm = 0;
	
	for (LIF<Chunk *> mici(&micl); !mici.done(); mici.next())
	{
		Matching_Images_Chunk * mic = (Matching_Images_Chunk *)mici();
		if (mic->flags & MICF_FIXEDPALETTE)
			mic_fix = mic;
		else
			mic_nrm = mic;
	}
		
	List<Chunk_With_Children *> shapesandsprites;
	
	List<Chunk *> shlst = Env_Chunk->lookup_child("REBSHAPE");
	for (LIF<Chunk *> shLIF(&shlst); !shLIF.done(); shLIF.next())
	{	
		List<Chunk *> shxflst = ((Shape_Chunk *)shLIF())->lookup_child("SHPEXTFL");
		if (shxflst.size())
		{
			shapesandsprites.add_entry( (Shape_External_File_Chunk *)shxflst.first_entry() );
		}
	}
	shlst = Env_Chunk->lookup_child("RSPRITES");
	if (shlst.size())
	{
		List<Chunk *> splst = ((Chunk_With_Children *)shlst.first_entry())->lookup_child("SPRIHEAD");

		for (LIF<Chunk *> spLIF(&splst); !spLIF.done(); spLIF.next())
		{	
			shapesandsprites.add_entry( (Chunk_With_Children *)spLIF() );
		}
	}

	int shapefound = rcname ? 0 : 1;
	
	for (LIF<Chunk_With_Children *> sasLIF(&shapesandsprites); !sasLIF.done(); sasLIF.next())
	{	
		char * subrifname = riff_basename(sasLIF());

		if (rcname)
		{
			if (_stricmp(subrifname,rcname)) // must match shapes name exactly
			{
				delete[] subrifname;
				continue;
			}
			shapefound = 1;
		}
		
		List<Chunk *> blsclst = sasLIF()->lookup_child("BMPLSTST");
		if (blsclst.size())
		{
			Bitmap_List_Store_Chunk * gbnc = (Bitmap_List_Store_Chunk *) blsclst.first_entry();

			for (LIF<BMP_Name> bmpni(&gbnc->bmps); !bmpni.done(); bmpni.next())
			{
				BMP_Name bmpnt(bmpni());
				strip_file_extension(bmpnt.filename);

				if (iname ? !_stricmp(name,strip_path(bmpnt.filename)) : enum_id == bmpnt.enum_id)
				{
				
					// select image descriptor
					char * riffname = riff_basename(envd);
					ImageDescriptor const idsc
						(
							(IDscFlags)((bmpnt.flags & ChunkBMPFlag_FixedPalette ?
								IDSCF_FIXEDPALETTE
							:
								IDSCF_0)
							|(gbnc->GetExtendedData()->flags & GBF_SPRITE ?
								IDSCF_SPRITE
							:
								IDSCF_SUBSHAPE)
							|IDSCF_INCLUDED),
							bmpni().filename,
							subrifname,
							bmpnt.flags & ChunkBMPFlag_FixedPalette ? riffname : 0
						);
					ImageDescriptor const * p_idsc = &idsc;
					delete[] riffname;

					if (bmpnt.flags & ChunkBMPFlag_FixedPalette)
					{
						if (mic_fix) p_idsc = &mic_fix->GetLoadImage(idsc);
						else _LOGPUT("WARNING! no rule to find fixed palette matching images in environment data\n");
					}
					else
					{
						if (mic_nrm) p_idsc = &mic_nrm->GetLoadImage(idsc);
						else _LOGPUT("WARNING! no rule to find matching images in environment data (interface engine?)\n");
					}

					#if TRY_OLD_DIRS // temporary until all textures move to SubShps/All directory
					if (*p_idsc == idsc)
					{
						// select image descriptor
						char * riffname = riff_basename(envd);
						ImageDescriptor const idsc2
							(
								(IDscFlags)((bmpnt.flags & ChunkBMPFlag_FixedPalette ?
									IDSCF_FIXEDPALETTE
								:
									IDSCF_0)
								|(gbnc->GetExtendedData()->flags & GBF_SPRITE ?
									IDSCF_SPRITE
								:
									IDSCF_0)
								|IDSCF_INCLUDED),
								bmpni().filename,
								subrifname,
								bmpnt.flags & ChunkBMPFlag_FixedPalette ? riffname : 0
							);
						ImageDescriptor const * p_idsc2 = &idsc2;
						delete[] riffname;

						if (bmpnt.flags & ChunkBMPFlag_FixedPalette)
						{
							if (mic_fix) p_idsc2 = &mic_fix->GetLoadImage(idsc2);
							else _LOGPUT("WARNING! no rule to find fixed palette matching images in environment data\n");
						}
						else
						{
							if (mic_nrm) p_idsc2 = &mic_nrm->GetLoadImage(idsc2);
							else _LOGPUT("WARNING! no rule to find matching images in environment data (interface engine?)\n");
						}
						if (*p_idsc2 != idsc2)
						{
							_LOGPUT("WARNING! Not listed as in SubShps directory\n");
							p_idsc = p_idsc2;
						}
					}
					#endif

					// load this image
					GetPath(*p_idsc,envd,bmpnt.flags);
					
					if (fname)
					{
						delete[] subrifname;
						if (rcname)
						{
							delete[] rcname;
							rcname = 0;
						}
						flags.located = 1;
						return CLE_OK;
					}
				}
			}
		}
		delete[] subrifname;
	}

	if (rcname)
	{
		if (!shapefound)
			_LOGPRINT(("WARNING! shape/sprite %s not found in this RIF file\n",rcname));
		else
			_LOGPRINT(("WARNING! shape/sprite %s does not appear to list %s\n",rcname,name));
		delete[] rcname;
		rcname = 0;
	}
	
	// not found in game textures, so look in default
	
	else // but only if there is no virtual shape directory
	{
		List<Chunk *> gbncl = envd->lookup_child("BMPNAMES");
		if (gbncl.size())
		{
			Global_BMP_Name_Chunk * gbnc = (Global_BMP_Name_Chunk *) gbncl.first_entry();

			for (LIF<BMP_Name> bmpni(&gbnc->bmps); !bmpni.done(); bmpni.next())
			{
				BMP_Name bmpnt(bmpni());
				strip_file_extension(bmpnt.filename);

				if (iname ? !_stricmp(name,strip_path(bmpnt.filename)) : enum_id == bmpnt.enum_id)
				{
					// select image descriptor
					ImageDescriptor const idsc (bmpnt.flags & ChunkBMPFlag_FixedPalette ? IDSCF_FIXEDPALETTE : IDSCF_0, bmpni().filename);
					ImageDescriptor const * p_idsc = &idsc;

					if (bmpnt.flags & ChunkBMPFlag_FixedPalette)
					{
						if (mic_fix) p_idsc = &mic_fix->GetLoadImage(idsc);
						else _LOGPUT("WARNING! no rule to find fixed palette matching images in environment data\n");
					}
					else
					{
						if (mic_nrm) p_idsc = &mic_nrm->GetLoadImage(idsc);
						else _LOGPUT("WARNING! no rule to find matching images in environment data (interface engine?)\n");
					}

					// load this image
					GetPath(*p_idsc,envd,bmpnt.flags);
					
					if (fname)
					{
						flags.located = 1;
						return CLE_OK;
					}
				}
			}
		}
	}

	if (retval != CLE_OK) return retval;
	return CLE_FINDERROR;
}
Beispiel #9
0
mword *_babel(bvm_cache *this_bvm, mword *loaded_bvm, mword *arg_stack, mword *sym_table){ // _babel#

    bvm_cache new_bvm;
    bvm_cache *new_bvm_ptr = &new_bvm;
    mword *result = nil;

    cache_new(this_bvm, new_bvm_ptr, loaded_bvm);

    mword *self = tptr_detag(new_bvm_ptr, tptr_detag(new_bvm_ptr, new_bvm_ptr->self)); // Could blow up due to mem_alloc()

    if( !trie_exists(new_bvm_ptr, self, BABEL_SYM_BVM_INITD, nil) ){
        trie_insert( new_bvm_ptr, self, BABEL_SYM_BVM_INITD, nil, _val(new_bvm_ptr,1) );
//        trie_insert( new_bvm_ptr, self, BABEL_SYM_BVM_INITD, nil, _val(new_bvm_ptr,0) );
    }

    mword *bvm_initd = rci(cache_read_from_bvm(new_bvm_ptr, BABEL_SYM_BVM_INITD),0);

    if(!rcl(bvm_initd,0)){
        bvm_new(new_bvm_ptr);
        lcl(bvm_initd,0) = 1;
    }
    else{
        cache_update(new_bvm_ptr);
    }

    if( !trie_exists(new_bvm_ptr, self, BABEL_SYM_CODE_RESTART_POINT, nil) ){
        trie_insert( new_bvm_ptr, self, BABEL_SYM_CODE_RESTART_POINT, nil, rci(new_bvm_ptr->code_ptr,0));
    }

    new_bvm_ptr->flags->BVM_CACHE_DIRTY   = FLAG_CLR;
    new_bvm_ptr->flags->BVM_CACHE_INVALID = FLAG_CLR;

    cache_flush(this_bvm);

    if(!is_nil(sym_table)){
        trie_insert(new_bvm_ptr, tptr_detag(new_bvm_ptr, new_bvm_ptr->self), BABEL_SYM_SOFT_ROOT, nil, sym_table);
    }

    trie_insert(new_bvm_ptr, tptr_detag(new_bvm_ptr, new_bvm_ptr->self), BABEL_SYM_PARENT_BVM, nil, this_bvm->self);

    new_bvm_ptr->flags->BVM_CODE_LIST_EMPTY = FLAG_CLR;

    while(!is_nil(arg_stack)){ // give the arg-list onto the BVM's dstack
        interp_push_operand(new_bvm_ptr, rci(arg_stack, 0));
        arg_stack = rci(arg_stack,1);
    }

    interp_core(new_bvm_ptr);

    cache_cp(new_bvm_ptr, this_bvm); //update flags and interp

    this_bvm->self = _ith(  this_bvm, 
                            trie_lookup_hash(
                                new_bvm_ptr, 
                                tptr_detag(new_bvm_ptr, new_bvm_ptr->self), 
                                BABEL_SYM_PARENT_BVM, 
                                nil),
                            2 );

    cache_update(this_bvm);

    this_bvm->flags->BVM_CACHE_DIRTY   = FLAG_CLR;
    this_bvm->flags->BVM_CACHE_INVALID = FLAG_CLR;

    //copy TOS from new_bvm to this_bvm
    oinfo oi;
    oi.default_data = nil;
    oi.required_tag = nil;
    oi.mask = OI_MASK_ANY;
    oi.min_size = 0;
    oi.max_size = 1;

    if( new_bvm_ptr->flags->BVM_RETURN_TOS_ON_EXIT == FLAG_SET 
            &&
        (new_bvm_ptr->flags->BVM_CODE_LIST_EMPTY == FLAG_SET 
            ||
        (get_advance_type(new_bvm_ptr) == BVM_RETURN))){

        get_operands(new_bvm_ptr,1,&oi);
        result = oi.data;

        stack_pop(new_bvm_ptr,rci(new_bvm_ptr->dstack_ptr,0));

//        stack_push(this_bvm,
//                rci(this_bvm->dstack_ptr,0),
//                stack_new_entry(
//                    this_bvm,
//                    oi.data,
//                    nil));

    }

    // Reset all flags in case of re-entry
    new_bvm_ptr->flags->BVM_RETURN_TOS_ON_EXIT = FLAG_CLR; // FIXME: This restore to previous value, not force-clear
    new_bvm_ptr->flags->BVM_CODE_LIST_EMPTY = FLAG_CLR;

    if(get_advance_type(new_bvm_ptr) == BVM_RETURN){
        set_advance_type(new_bvm_ptr, BVM_ADVANCE);
    }

    this_bvm->flags->BVM_RETURN_TOS_ON_EXIT = FLAG_CLR;
    this_bvm->flags->BVM_CODE_LIST_EMPTY    = FLAG_CLR;

    return result;

}
Beispiel #10
0
// XXX The return-value from this function contains unsafe pointers!!! XXX
// XXX internal interp use ONLY                                        XXX
// XXX If you pass tag=nil, returns ALL tags in bs                     XXX
// XXX PERF: A _tags2ar (like _bs2ar) would be more efficient          XXX
//
mword *tptr_find_tag_unsafe(bvm_cache *this_bvm, mword *bs, mword *tag){ // tptr_find_tag_unsafe#

    mword *span_array     = _bs2ar(this_bvm, bs);
    mword size_span_array = size(span_array);
    mword size_inte;
    mword *tag_list       = nil;
    mword *curr_span_elem;
    mword *curr_inte_elem;


//_dump(span_array);

    int i,j;
    for(i=0; i<size_span_array; i++){

        curr_span_elem = rci(span_array,i);

        if(is_inte(curr_span_elem)){ // check each element

            size_inte = size(curr_span_elem);

            for(j=0;j<size_inte;j++){

                curr_inte_elem = rci(curr_span_elem,j);

                if(is_nil(curr_inte_elem)){
                    continue;
                }

                if(is_tptr(curr_inte_elem)){

                    if(is_nil(tag)){

                        // push onto tag_list
                        if(is_nil(tag_list)){
                            tag_list = _cons(this_bvm, (curr_span_elem+j), nil);
                        }
                        else{
                            _unshift(this_bvm, tag_list, (curr_span_elem+j));
                        }

                    }
                    else{

                        if( tageq(curr_inte_elem, tag, TAG_SIZE) ){

                            // push onto tag_list
                            if(is_nil(tag_list)){
                                tag_list = _cons(this_bvm, (curr_span_elem+j), nil);
                            }
                            else{
                                _unshift(this_bvm, tag_list, (curr_span_elem+j));
                            }

                        }

                    }


                }

            }

        }

    }

    return tag_list;

}
void COutlook2Ctrl::DrawSubItem(CDC * pDC, COL2Folder * oFolder, COL2Item * iItem, COL2SubItem * pSubItem, bool bOver)
{
	CRect rect(pSubItem->rcItem);
	CFont * of = (CFont *) pDC->SelectObject(&ftItems);
	pDC->SetBkColor(m_crBackground);

	switch (pSubItem->dwStyle)
	{
	case 0:
		{
			pDC->SetTextColor(m_crCmdOther);
			if (bOver)
			{
				pDC->SelectObject(&ftHotItems);
			}

			if (pSubItem->hIcon && rect.left+25 < rect.right)
			{
				if (pSubItem->hIcon) DrawIconEx(pDC->GetSafeHdc(), rect.left+8, rect.top+1, pSubItem->hIcon,16,16,0,NULL, DI_NORMAL);
			}
			rect.left += 28;
			
			if (pSubItem->lParam)
			{
				COL2CCmdUI pui;
				pui.pSI = pSubItem;
				pui.m_nID = pSubItem->lParam;
				GetOwner()->OnCmdMsg(pui.m_nID, CN_UPDATE_COMMAND_UI, &pui, NULL);
				if (pui.iRes&2) pDC->FillSolidRect(rect, GetSysColor(COLOR_3DFACE)); // checked
				pSubItem->iLastStatus = pui.iRes;
			}

			pDC->DrawText(pSubItem->csName, rect, DT_SINGLELINE|DT_END_ELLIPSIS|DT_VCENTER);
		}
		break;
	case 1:
		{
			pDC->SetTextColor(m_crCmdOther);

			DWORD dwHotStyle = 0;

			if (bOver) 
			{
#if(WINVER >= 0x0500)
				dwHotStyle = DFCS_HOT;
#endif
				pDC->SelectObject(&ftHotItems);
			}
			CRect rci(rect.left+8, rect.top+2, rect.left + 20, rect.top + 14);
			if (pSubItem->lParam)
			{
				COL2CCmdUI pui;
				pui.pSI = pSubItem;
				pui.m_nID = pSubItem->lParam; 
				GetOwner()->OnCmdMsg(pui.m_nID, CN_UPDATE_COMMAND_UI, &pui, NULL);
				if (!(pui.iRes&2)) pDC->DrawFrameControl(rci, DFC_BUTTON, DFCS_BUTTONRADIO|DFCS_FLAT|dwHotStyle);
				else pDC->DrawFrameControl(rci, DFC_BUTTON, DFCS_BUTTONRADIO|DFCS_FLAT|DFCS_CHECKED|dwHotStyle);
				pSubItem->iLastStatus = pui.iRes;
			}
			else pDC->DrawFrameControl(rci, DFC_BUTTON, DFCS_BUTTONRADIO|DFCS_FLAT|dwHotStyle);
			rect.left += 28;

			pDC->DrawText(pSubItem->csName, rect, DT_SINGLELINE|DT_END_ELLIPSIS|DT_VCENTER);
		}
		break;
	case 2:
		{
			pDC->SetTextColor(m_crCmdLink);
			rect.left += 28;

			if (bOver) 
				pDC->SelectObject(&ftHotItems);

			if (pSubItem->lParam)
			{
				COL2CCmdUI pui;
				pui.pSI = pSubItem;
				pui.m_nID = pSubItem->lParam;
				GetOwner()->OnCmdMsg(pui.m_nID, CN_UPDATE_COMMAND_UI, &pui, NULL);
				pSubItem->iLastStatus = pui.iRes;
			}

			pDC->DrawText(pSubItem->csName, rect, DT_SINGLELINE|DT_END_ELLIPSIS|DT_VCENTER);

		}
		break;
	case 3: // checkbox
		{
			pDC->SetTextColor(m_crCmdOther);

			DWORD dwHotStyle = 0;
			if (bOver) 
			{
#if(WINVER >= 0x0500)
				dwHotStyle = DFCS_HOT;
#endif
				pDC->SelectObject(&ftHotItems);
			}

			CRect rci(rect.left+8, rect.top+2, rect.left + 20, rect.top + 14);
			if (pSubItem->lParam)
			{
				COL2CCmdUI pui;
				pui.pSI = pSubItem;
				pui.m_nID = pSubItem->lParam; 
				GetOwner()->OnCmdMsg(pui.m_nID, CN_UPDATE_COMMAND_UI, &pui, NULL);
				if (!(pui.iRes&2)) pDC->DrawFrameControl(rci, DFC_BUTTON, DFCS_BUTTONCHECK|DFCS_FLAT|dwHotStyle);
				else pDC->DrawFrameControl(rci, DFC_BUTTON, DFCS_BUTTONCHECK|DFCS_FLAT|DFCS_CHECKED|dwHotStyle);
				pSubItem->iLastStatus = pui.iRes;
			}
			else pDC->DrawFrameControl(rci, DFC_BUTTON, DFCS_BUTTONCHECK|DFCS_FLAT|dwHotStyle);
			rect.left += 28;

			pDC->DrawText(pSubItem->csName, rect, DT_SINGLELINE|DT_END_ELLIPSIS|DT_VCENTER);
		}
		break;
	}
	pDC->SelectObject(of);
}