コード例 #1
0
ファイル: symlist.c プロジェクト: JWasm/JWlink
static orl_return CheckSymbol( orl_symbol_handle orl_sym_hnd )
/************************************************************/
{
    orl_symbol_binding  binding;
    char                *name;
    orl_symbol_type     type;
    unsigned char       info;

    name = ORLSymbolGetName( orl_sym_hnd );
    binding = ORLSymbolGetBinding( orl_sym_hnd );
    if( binding == ORL_SYM_BINDING_GLOBAL || binding == ORL_SYM_BINDING_WEAK ) {
        type = ORLSymbolGetType( orl_sym_hnd );
        info = ORLSymbolGetRawInfo( orl_sym_hnd );
        if( !( type & ORL_SYM_TYPE_UNDEFINED ) ) {
            if( type & ORL_SYM_CDAT_MASK || binding == ORL_SYM_BINDING_WEAK ) {
                AddSym( name, SYM_WEAK, info );
            } else {
                AddSym( name,  SYM_STRONG, info );
            }
        } else if( ORLSymbolGetValue( orl_sym_hnd ) != 0 ) {
            AddSym( name,  SYM_WEAK, info );
        }
    } else if( binding == ORL_SYM_BINDING_ALIAS ) {
        AddSym( name, SYM_WEAK, 0 );
    }
    return( ORL_OKAY );
}
コード例 #2
0
static orl_return CheckSymbol( orl_symbol_handle orl_sym_hnd )
/************************************************************/
{
    orl_symbol_binding  binding;
    const char          *name;
    orl_symbol_type     type;
    unsigned char       info;

    name = ORLSymbolGetName( orl_sym_hnd );
    binding = ORLSymbolGetBinding( orl_sym_hnd );
    if( binding == ORL_SYM_BINDING_GLOBAL || binding == ORL_SYM_BINDING_WEAK ) {
        type = ORLSymbolGetType( orl_sym_hnd );
        info = ORLSymbolGetRawInfo( orl_sym_hnd );
        if( (type & ORL_SYM_TYPE_UNDEFINED) == 0 ) {
            if( (type & ORL_SYM_CDAT_MASK) || binding == ORL_SYM_BINDING_WEAK ) {
                AddSym( name, SYM_WEAK, info );
            } else {
                AddSym( name, SYM_STRONG, info );
            }
        } else {
            unsigned_64 val64;

            ORLSymbolGetValue( orl_sym_hnd, &val64 );
            if( val64.u._32[I64LO32] != 0 || val64.u._32[I64HI32] != 0 ) {
                AddSym( name, SYM_WEAK, info );
            }
        }
    } else if( binding == ORL_SYM_BINDING_ALIAS ) {
        AddSym( name, SYM_WEAK, 0 );
    }
    return( ORL_OKAY );
}
コード例 #3
0
symbol * HashReplace( symbol *sym )
/****************************************/
{
    symbol *    newsym;

    if( sym->mod == NULL )
        return sym;
    Ring2Prune( &sym->mod->publist, sym );
    if( IS_SYM_COMMUNAL(sym) ) {
        sym->p.seg->isdead = TRUE;
    }
    if( !(LinkFlags & INC_LINK_FLAG) )
        return sym;
    newsym = AddSym();
    newsym->e.mainsym = sym;
    newsym->name = sym->name;
    newsym->namelen_cmp = sym->namelen_cmp;
    newsym->info = sym->info | SYM_DEAD | SYM_IS_ALTDEF;
    Ring2Append( &sym->mod->publist, newsym );
    RingAppend( &sym->u.altdefs, newsym );
    if( IS_SYM_NICOMDEF(sym) ) {
        sym->p.cdefsize = sym->p.seg->length;
    }
    return sym;
}
コード例 #4
0
static symbol *DoSymOp( sym_flags op, char *symname, size_t length )
/******************************************************************/
{
    unsigned    hash;
    symbol      *sym;
    size_t      searchlen;
#ifdef _INT_DEBUG
    char        *symname_dbg;

    symname_dbg = alloca( length + 1 );
    memcpy( symname_dbg, symname, length );
    symname_dbg[ length ] = '\0';
#endif
    DEBUG(( DBG_OLD, "SymOp( %d, %s, %d )", op, symname_dbg, length ));
    if( NameLen != 0 && NameLen < length ) {
        searchlen = NameLen;
    } else {
        searchlen = length;
    }
    if( op & ST_STATIC ) {
        hash = StaticHashFn( symname, searchlen );
        /* If symbol isn't unique, don't look for duplicates. */
        if( (op & (ST_CREATE | ST_STATIC | ST_NONUNIQUE)) ==
                  (ST_CREATE | ST_STATIC | ST_NONUNIQUE) )
            sym = NULL;
        else
            sym = StaticSearchSym( symname, hash, searchlen );
    } else {
        hash = GlobalHashFn( symname, searchlen );
        sym = GlobalSearchSym( symname, hash, searchlen );
    }
    DEBUG(( DBG_OLD, "- hash %d", hash ));
    if( sym != NULL ) {
        DEBUG(( DBG_OLD, "found symbol %s", symname_dbg ));
        DEBUG(( DBG_OLD, " - handle = %h", sym ));
        return( sym );
    }
    if( !(op & ST_FIND) ) {
        sym = AddSym();
        sym->name = AddSymbolStringTable( &PermStrings, symname, length );
        sym->namelen_cmp = searchlen;

        if( op & ST_STATIC ) {
            sym->info |= SYM_STATIC;
            sym->hash = StaticSymPtrs[hash];
            StaticSymPtrs[hash] = sym;
        } else {
            sym->hash = GlobalSymPtrs[hash];
            GlobalSymPtrs[hash] = sym;
        }
        DEBUG((DBG_OLD, "added symbol %s", symname_dbg ));
    }
    return( sym );
}
コード例 #5
0
ファイル: lsymtab.c プロジェクト: JWasm/JWlink
static symbol *DoSymOp( sym_flags op, char *symname, unsigned length )
/********************************************************************/
{
    unsigned    hash;
    symbol      *sym;
    unsigned    searchlen;
#ifdef _INT_DEBUG
    char        *symname_dbg;

    symname_dbg = alloca( length + 1 );
    memcpy( symname_dbg, symname, length );
    symname_dbg[ length ] = '\0';
#endif
    if( NameLen != 0 && NameLen < length ) {
        searchlen = NameLen;
    } else {
        searchlen = length;
    }
    if( op & ST_STATIC ) {
        hash = StaticHashFn( symname, searchlen );
        /* jwlink: allow duplicate static symbols */
        //sym = StaticSearchSym( symname, hash, searchlen );
        if ( ( op & ( ST_CREATE|ST_STATIC|ST_DUPLICATE ) ) == ( ST_CREATE|ST_STATIC|ST_DUPLICATE) )
            sym = NULL;
        else
            sym = StaticSearchSym( symname, hash, searchlen );
    } else {
        hash = GlobalHashFn( symname, searchlen );
        sym = GlobalSearchSym( symname, hash, searchlen );
    }
    DEBUG(( DBG_OLD, "SymOp( %d, %s, %d ) - hash %d - handle = %h", op, symname_dbg, length, hash, sym ));
    if( sym != NULL ) {
        //DEBUG(( DBG_OLD, "found symbol %s", symname_dbg ));
        //DEBUG(( DBG_OLD, " - handle = %h", sym ));
        return( sym );
    }
    if( !(op & ST_FIND) ) {
        sym = AddSym();
        sym->name = AddSymbolStringTable( &PermStrings, symname, length );
        sym->namelen_cmp = searchlen;

        if( op & ST_STATIC ) {
            sym->info |= SYM_STATIC;
            sym->hash = StaticSymPtrs[hash];
            StaticSymPtrs[hash] = sym;
        } else {
            sym->hash = GlobalSymPtrs[hash];
            GlobalSymPtrs[hash] = sym;
        }
        DEBUG((DBG_OLD, "DoSymOp: added symbol %s hdl=%h info=%h", symname_dbg, sym, sym->info ));
    }
    return( sym );
}
コード例 #6
0
symbol * AddAltDef( symbol *sym, sym_info sym_type )
/*********************************************************/
{
    symbol *    altsym;

    if( !(LinkFlags & INC_LINK_FLAG) )
        return sym;
    altsym = AddSym();
    SET_SYM_TYPE( altsym, sym_type );
    altsym->info |= SYM_DEAD | SYM_IS_ALTDEF;
    altsym->mod = CurrMod;
    altsym->name = sym->name;
    altsym->e.mainsym = sym;
    Ring2Append( &CurrMod->publist, altsym );
    RingAppend( &sym->u.altdefs, altsym );
    return altsym;
}
コード例 #7
0
ファイル: MFCSimpleTypeView.cpp プロジェクト: dakyri/qua
void
MFCSimpleTypeView::ContextMenu(UINT nFlags, CPoint point)
{
	long	caty[] = {
//				TypedValue::S_DOUBLE,
//				TypedValue::S_LAMBDA,
		TypedValue::S_FLOAT,
		TypedValue::S_INT,
		TypedValue::S_SHORT,
		TypedValue::S_BYTE,
		TypedValue::S_BOOL
			};
	CPoint		popPt = point;
	ClientToScreen(&popPt);

	CMenu		*ctxtMenu = new CMenu;
	ctxtMenu->CreatePopupMenu();
	CMenu		*addVarMenu = new CMenu;
	addVarMenu->CreatePopupMenu();

	char		buf[512];
	long	item = ItemAtPoint(point);
	for (short i=0; i<sizeof(caty)/sizeof(caty[0]); i++) {
		if (ID_VARIABLECONTEXT_ADD_VAR + caty[i] > ID_VARIABLECONTEXT_ADD_VAR_TYPE_RANGE) {
			reportError("Internal error. type index value exceeded in menu creator, is %d and shouldn't exceed %d",
					caty[i], ID_VARIABLECONTEXT_ADD_VAR_TYPE_RANGE-ID_VARIABLECONTEXT_ADD_VAR);
		} else {
			string tnm = findTypeName(caty[i]);
			if (tnm.size()) {
				sprintf(buf, "%s", tnm.c_str());
				addVarMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_ADD_VAR + caty[i], buf);
			}
		}
	}

	ctxtMenu->AppendMenu(MF_POPUP, (UINT) addVarMenu->m_hMenu, "add variable");
	ctxtMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_ADD_METHOD, "add method");
	StabEnt		*itemSym = NULL;
	if (item >= 0) {
// delete selected item
// set selected item envelope
// set selected item display type
// set selected item length ... to create an array
		itemSym = SymForItem(item);

		if (itemSym != NULL) {
			CMenu		*setVarTypeMenu = new CMenu;
			setVarTypeMenu->CreatePopupMenu();
			for (short i=0; i<sizeof(caty)/sizeof(caty[0]); i++) {
				if (ID_VARIABLECONTEXT_SET_VAR_TYPE + caty[i] > ID_VARIABLECONTEXT_SET_VAR_TYPE_RANGE) {
					reportError("Internal error. type index value exceeded in menu creator, is %d and shouldn't exceed %d",
							caty[i], ID_VARIABLECONTEXT_SET_VAR_TYPE_RANGE-ID_VARIABLECONTEXT_SET_VAR_TYPE);
				} else {
					string tnm = findTypeName(caty[i]);
					if (tnm.size() && itemSym->type != caty[i]) {
						sprintf(buf, "%s", tnm.c_str());
						setVarTypeMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_SET_VAR_TYPE + caty[i], buf);
					}
				}
			}

			sprintf(buf, "set '%s' type", itemSym->uniqueName());
			ctxtMenu->AppendMenu(MF_POPUP, (UINT) setVarTypeMenu->m_hMenu, buf);

			sprintf(buf, "delete '%s'", itemSym->uniqueName());
			ctxtMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_DELETE_SELECTED, buf);
			sprintf(buf, "set '%s' envelope", itemSym->uniqueName());
			ctxtMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_ENVELOPE_SELECTED, buf);

			CMenu		*dispVarMenu = new CMenu;
			dispVarMenu->CreatePopupMenu();
			dispVarMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_NODISPLAY_SELECTED, "none");
			dispVarMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_CONTROL_SELECTED, "control");
			dispVarMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_DISPLAY_SELECTED, "display");
			sprintf(buf, "set '%s' display", itemSym->uniqueName());
			ctxtMenu->AppendMenu(MF_POPUP, (UINT) dispVarMenu->m_hMenu, buf);

			ctxtMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_SET_LENGTH_SELECTED, "set length");
		}
	}

// add item
//    by type
// structures ????
	short ret = ctxtMenu->TrackPopupMenuEx(
						TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RETURNCMD,
						popPt.x, popPt.y, this, NULL);

	if (ret >= ID_VARIABLECONTEXT_ADD_VAR && ret <= ID_VARIABLECONTEXT_ADD_VAR_TYPE_RANGE) {
		long typ = ret - ID_VARIABLECONTEXT_ADD_VAR;
		if (parent && parent->Symbol()) {
			StabEnt	*pSym = parent->Symbol();
			Stackable	*stkbl = pSym->StackableValue();
			if (stkbl) {
				char	*vnm = "variable%d";
				switch(typ) {
				case TypedValue::S_BYTE: vnm = "bytevar"; break;
					case TypedValue::S_SHORT: vnm = "wordvar"; break;
					case TypedValue::S_INT: vnm = "intvar"; break;
					case TypedValue::S_LONG: vnm = "longvar"; break;
					case TypedValue::S_FLOAT: vnm = "floatvar"; break;
				}
				string	nmbuf = glob.makeUniqueName(pSym, vnm, 1);
				StabEnt	*nsym=DefineSymbol(nmbuf, typ, 0, 0, pSym, TypedValue::REF_STACK, false, false, StabEnt::DISPLAY_NOT);
				stkbl->ReAllocateChildren();
				AddSym(nsym);
			}
		}
	} else if (ret == ID_VARIABLECONTEXT_ADD_METHOD) {
		if (parent && parent->Symbol()) {
			StabEnt	*pSym = parent->Symbol();
			string nmbuf = glob.makeUniqueName(pSym, "action", 1);
			QuaPerceptualSet	*quaLink=parent->QuaLink();
			if (quaLink) {
                StabEnt *mSym = quaLink->CreateMethod(nmbuf, pSym);
				if (mSym) {
					AddSym(mSym);
					fprintf(stderr, "tried to add method element\n");
				}
			}
		}
	} else if (ret >= ID_VARIABLECONTEXT_SET_VAR_TYPE && ret <= ID_VARIABLECONTEXT_SET_VAR_TYPE_RANGE) {
		long typ = ret - ID_VARIABLECONTEXT_SET_VAR_TYPE;
		if (itemSym && parent && parent->Symbol()) {
			StabEnt	*pSym = parent->Symbol();
			Stackable	*stkbl = pSym->StackableValue();
			if (stkbl) {
				bool	validChange = false;
				switch(typ) {
				case TypedValue::S_BYTE: validChange = true; break;
					case TypedValue::S_SHORT: validChange = true; break;
					case TypedValue::S_INT: validChange = true; break;
					case TypedValue::S_LONG: validChange = true; break;
					case TypedValue::S_FLOAT: validChange = true; break;
				}
				if (validChange) {
					itemSym->type = typ;
					stkbl->ReAllocateChildren();
				}
			}
		}
	} else if (ret == ID_VARIABLECONTEXT_DELETE_SELECTED) {
		if (itemSym) {
			glob.DeleteSymbol(itemSym, true);
			RemoveSym(itemSym);
			if (parent && parent->Symbol()) {
				StabEnt	*pSym = parent->Symbol();
				Stackable	*stkbl = pSym->StackableValue();
				if (stkbl) {
					stkbl->ReAllocateChildren();
				}
			}
		}
	} else if (ret == ID_VARIABLECONTEXT_ENVELOPE_SELECTED) {
		if (itemSym) {
			itemSym->SetEnvelopeMode(true);
		}
	} else if (ret == ID_VARIABLECONTEXT_NODISPLAY_SELECTED) {
		if (itemSym) {
			itemSym->SetDisplayMode(StabEnt::DISPLAY_NOT);
// forces redisplay of this entry to show icon change
			GetListCtrl().SetItemText(item, 3, "N");
		}
	} else if (ret == ID_VARIABLECONTEXT_DISPLAY_SELECTED) {
		if (itemSym) {
			itemSym->SetDisplayMode(StabEnt::DISPLAY_DISP);
// forces redisplay of this entry
			GetListCtrl().SetItemText(item, 3, "D");
		}
	} else if (ret == ID_VARIABLECONTEXT_CONTROL_SELECTED) {
		if (itemSym) {
			itemSym->SetDisplayMode(StabEnt::DISPLAY_CTL);
// forces redisplay of this entry
			GetListCtrl().SetItemText(item, 3, "C");
		}
	} else if (ret == ID_VARIABLECONTEXT_SET_LENGTH_SELECTED) {
		reportError("Currently only undimensioned data are supported by this interface .... but they can be added manually by hand-editting the script");
	}
}
コード例 #8
0
ファイル: symbol.c プロジェクト: invisibleboy/mycompiler
void
main ()
{
  int id, *XXX;
  char *YYY;
  void *ZZZ;
  struct
  {
    int a, b;
  }
   *AAA;
  Symbol s;
  fprintf (stderr, "#####\n");
  id = NewSymTbl (7);
  s = AddSym (id, "aaa", 1);
  pr (s);
  s = FindSym (id, "aaa", 2);
  pr (s);
  s = AddSym (id, "bbb", 2);
  pr (s);
  s = FindSym (id, "bbb", 2);
  pr (s);
  s = AddSym (id, "ccc", 2);
  pr (s);
  s = AddSym (id, "ddd", 2);
  pr (s);
  s->ptr = XXX;
  s = AddSym (id, "ddd", 2);
  pr (s);
  s = AddSym (id, "eee", 2);
  pr (s);
  s = FindSym (id, "eee", 1);
  pr (s);
  s = AddSym (id, "fff", 2);
  pr (s);
  s->ptr = (Symbol) YYY;
  s = AddSym (id, "fff", 2);
  pr (s);
  s->ptr = (Symbol) ZZZ;
  s = AddSym (id, "fff", 2);
  pr (s);
  s->ptr = (Symbol) AAA;
  s = FindSym (id, "fff", 2);
  pr (s);
  s = AddSym (id, "ggg", 2);
  pr (s);
  s = AddSym (id, "hhh", 2);
  pr (s);
  fprintf (stderr, "#####\n");
}