Пример #1
0
static int
_report_error(int err,
	dident arg1,		/* any arity */
	dident module,		/* arity 0 */
	type mod_tag)
{
    int res;
    pword *old_tg = TG;
    pword *tg = TG;
    pword mod, goal;

    Make_Struct(&goal, TG);

    Push_Struct_Frame(d_.syserror); ++tg;
    Make_Integer(tg, -err); ++tg;
    Make_Struct(tg, TG); ++tg;
    tg->val.did = module;
    tg++->tag.all = mod_tag.all;
    tg->val.did = module;
    tg++->tag.all = mod_tag.all;

    Push_Struct_Frame(d_.quotient); ++tg;
    Make_Atom(tg, add_dict(arg1,0)); ++tg;
    Make_Integer(tg, DidArity(arg1));

    mod.val.did = d_.kernel_sepia;
    mod.tag.kernel = ModuleTag(d_.kernel_sepia);
    res = query_emulc(goal.val, goal.tag, mod.val, mod.tag);
    TG = old_tg;
    return res;
}
Пример #2
0
static int
p_tool_body(value vi, type ti, value vb, type tb, value vmb, type tmb, value vm, type tm)
{
	dident	di;
	pri	*procb, *proci;
	int	flags, arity;
	dident	module;
	dident	pdid;
	pword	*ptr = Gbl_Tg;
	vmcode	*code;
	int	err;
	Prepare_Requests;

	Check_Module(tm, vm);
	Get_Proc_Did(vi, ti, di);
	if (!IsRef(tb)
	    && (!IsStructure(tb)
		|| vb.ptr->val.did != d_.quotient))
	{
	    Bip_Error(TYPE_ERROR);
	}
	Check_Output_Atom_Or_Nil(vmb, tmb);
	if (!(proci = visible_procedure(di, vm.did, tm, PRI_CREATE)))
	{
	    Get_Bip_Error(err);
	    Bip_Error(err);
	}

	if (!_tool_body(proci, &pdid, &arity, &module))
	{
	    Get_Bip_Error(err);
	    Bip_Error(err);
	}

	Gbl_Tg += 3;
	Check_Gc;
	ptr[0].tag.kernel = TDICT;
	ptr[0].val.did = d_.quotient;
	ptr[1].tag.kernel = TDICT;
	ptr[1].val.did = add_dict(pdid, 0);
	ptr[2].tag.kernel = TINT;
	ptr[2].val.nint = arity;

	Request_Unify_Atom(vmb, tmb, module);
	Request_Unify_Structure(vb, tb, ptr);
	Return_Unify;
}
Пример #3
0
/*
 * visible_op(functor, module) return a pointer to the visible operator
 * under functor (an infix operator if functor is arity 2, an unary operator
 * if functor is of arity 1 (if a prefix and a postfix are visible,
 * the prefix is returned).
 * return 0 if no operator is visible from module under functor.
 * NOTE : when there is a prefix/postfix conflict, a local declaration
 * should be return when there is one (e.g. local postfix and global prefix).
 */
opi*
visible_op(dident functor, dident module, type mod_tag, int *res)
{
    opi		*operator_prop;
    int		arity;
    dident	atom = add_dict(functor, 0);

    if ((arity = DidArity(functor)) == 1)
    {
	/* look for a unary operator: first try FX,FY then XF,YF */
	operator_prop = visible_prefix_op(atom, module, mod_tag, res);
	/* visible_prefix_op() also finds FXX and FXY: ignore them here */
	if (!operator_prop || IsPrefix2(operator_prop))
	{
	    /* no unary prefix, look for postfix */
	    operator_prop = visible_postfix_op(atom, module, mod_tag, res);
	}
    }
    else if (arity == 2)
    {
	/* look for a binary operator, first try XFX,XFY,YFX then FXX,FXY */
	operator_prop = visible_infix_op(atom, module, mod_tag, res);
	if (!operator_prop)
	{
	    /* no infix, look for binary prefix */
	    operator_prop = visible_prefix_op(atom, module, mod_tag, res);
	    if (operator_prop && !IsPrefix2(operator_prop))
	    	operator_prop = (opi *) 0;
	}
    }
    else /* arity != 1 && arity != 2 so it is not an operator		*/
    {
	*res = PERROR; /* means no operator */
	return 0;
    }
    return operator_prop;
}
Пример #4
0
/*
  _insert_op( scope, preced, assoc, oper, module, mod_tag)
  An insertion is made in the operator property list if there are
  no conflict of associativity (postfix and infix).
  However a local postfix/infix hide a global one so that
  the conflict is impossible between a local and a global.
  A local operator can not be modified in a locked module if the
  module tag is not signed.
  The precedence 0 is used to hide a global operator.
*/
static int
_insert_op(int scope, word preced, word assoc, dident oper, dident module, type mod_tag)
{
    opi		*operator_prop;
    int		prop_type;
    int		arity;
    int		res;

    switch (assoc)
    {
    case XF:
    case YF:
	prop_type = POSTFIX_PROP;
	arity = 1;
	break;
    case FX:
    case FY:
	prop_type = PREFIX_PROP;
	arity = 1;
	break;
    case FXX:
    case FXY:
	prop_type = PREFIX_PROP;
	arity = 2;
	break;
    case XFX:
    case XFY:
    case YFX:
	prop_type = INFIX_PROP;
	arity = 2;
	break;
    }

    /* Disallow infix/postfix, if required by the module syntax */
    if (prop_type != PREFIX_PROP  &&  ModuleSyntax(module)->options & ISO_RESTRICTIONS)
    {
        if (OperatorItem(oper, module, mod_tag, VISIBLE_PROP,
                (prop_type==INFIX_PROP? POSTFIX_PROP : INFIX_PROP), &res))
        {
	    Bip_Error(ILLEGAL_OP_DEF);
        }
    }

    a_mutex_lock(&PropertyLock);

    res = PERROR;
    operator_prop = OperatorItem(oper, module, mod_tag, scope, prop_type, &res);

    if (operator_prop)		/* same scope operator exists already */
    {
	if (preced && (GetOpiAssoc(operator_prop) != assoc ||
			GetOpiPreced(operator_prop) != preced)) {
	    res = REDEF_OPERATOR;
	} else {
	    res = PSUCCEED;
	}
    }
    else
    {
	if (res != PERROR)
	{
	    a_mutex_unlock(&PropertyLock);
	    Bip_Error(res);
	}
	/* No proper scope operator exists yet */
	/* For locals, check hiding */
	if (scope == LOCAL_PROP &&
	    OperatorItem(oper, module, mod_tag, GLOBAL_PROP, prop_type, &res))
	    res = HIDING_OPERATOR;
	else
	    res = PSUCCEED;

	operator_prop = NewOperatorItem(oper, module, mod_tag,
					scope, prop_type, &res);
	if (!operator_prop)
	{
	    a_mutex_unlock(&PropertyLock);
	    Bip_Error(res);
	}
    }

    /* now update the descriptor					*/
    operator_prop->tag.kernel = TDICT;
    Set_Opi_Assoc(operator_prop, assoc);
    Set_Opi_Preced(operator_prop, preced);
    OpiDid(operator_prop) = add_dict(oper, arity);
    DidIsOp(oper) |= PropToFix(prop_type);

    a_mutex_unlock(&PropertyLock);
    if (res < 0)
	{Bip_Error(res)}
    return res;
}
Пример #5
0
void init_dict( SPELLEROBJ * st )
{
	st->entries=0;

	add_dict(st,2,"Wörter ->","\3");
	add_dict(st,1,"<_G.,!?","< \2.,!?");
	add_dict(st,1,"enis","enis");
	add_dict(st,1,"ratd","ratd");
	add_dict(st,1,"hulc","hulc");
	add_dict(st,1,"gmobp","gmobp");
	add_dict(st,1,"vwfkz","vwfkz");
	add_dict(st,1,"jyxqäöü","jyxqäöü");
	add_dict(st,1,"012345678","0123456789");
	//add_dict(st,2,"Text senden","\1");
	add_dict(st,1,"F12345678","F12345678");
	st->dict[(st->entries)-1].data[1]=10;
	st->dict[(st->entries)-1].data[2]=11;
	st->dict[(st->entries)-1].data[3]=12;
	st->dict[(st->entries)-1].data[4]=13;
	st->dict[(st->entries)-1].data[5]=14;
	st->dict[(st->entries)-1].data[6]=15;
	st->dict[(st->entries)-1].data[7]=16;
	st->dict[(st->entries)-1].data[8]=17;

	add_dict(st,2,"Wörterbücher","\4");
	


	st->dict[START_WORDS].type=0;st->dict[START_WORDS].count=0;
	st->wordcount=0;
}
bool add_dict(dict *d, char *key, int type, ...)
{
    uint32_t key_index = 0;
    int count = 0;
    dictEntry *de = NULL;
    va_list value_ptr;
    char *string_value_ptr = NULL;

    va_start(value_ptr, type);
    if (key == NULL || strlen(key) == 0)
    {
	    printf("Enpty key.\n");
	    return false;
    }
    if (exist_key(d, key) == true)
    {
	printf("Exist a same key.\n");
	return false;
    }
    if (d->rehash_index == -1)
    {
	if(d->hash_table[0].size <= d->hash_table[0].used )
	{
	    d->hash_table[1].table = (dictEntry **)calloc(growth_size(d->hash_table[0].used ), sizeof(dictEntry *));
	    for (count = 0; count < growth_size(d->hash_table[0].used); count ++)
	    {
		d->hash_table[1].table[count] = NULL;                           //pointer
	    }
	    d->hash_table[1].size = growth_size(d->hash_table[0].used);
	    d->hash_table[1].size_mask = d->hash_table[1].size - 1;
	    d->hash_table[1].used = 0;
	    d->rehash_index = 0;
	    single_rehash_dict(d);
	    switch (type) {
	    case BOOL_FALSE:
	    {
		    add_dict(d, key, type);
	    }
		    break;
	    case BOOL_TRUE:
	    {
		    add_dict(d, key, type);
	    }
		    break;
	    case INTTYPE:
	    {
		    add_dict(d, key, type, va_arg(value_ptr, long));
	    }
		    break;
	    case DECIMALTYPE:
	    {
		    add_dict(d, key, type, va_arg(value_ptr, double));
	    }
		    break;
	    case STRINGTYPE:
	    {
		    add_dict(d, key, type, va_arg(value_ptr, char *));
	    }
		    break;
	    case OBJECTTYPE:
	    {
		    add_dict(d, key, type, va_arg(value_ptr, void *));
	    }
		    break;
	    default:
	    {
		    printf("value type is error.\n");
		    return false;
	    }
		    break;
	    }
	}
	else
	{
	    key_index = murmurhash(key, (uint32_t )strlen(key), MMHASH_SEED);
	    key_index = key_index & d->hash_table[0].size_mask;
	    de = (dictEntry *)calloc(1, sizeof(dictEntry));
	    de->key = (char *)calloc(strlen(key) + 1, sizeof(char));
	    memcpy(de->key, key, strlen(key));
	    switch (type) {
	    case BOOL_FALSE:
	    {
		    de->value_type = BOOL_FALSE;
		    de->value.bool_value = false;
	    }
		break;
	    case BOOL_TRUE:
	    {
		    de->value_type = BOOL_TRUE;
		    de->value.num_value = true;
	    }
		break;
	    case INTTYPE:
	    {
		    de->value_type = INTTYPE;
		    de->value.num_value = va_arg(value_ptr, long);
	    }
		break;
	    case DECIMALTYPE:
	    {
		    de->value_type = DECIMALTYPE;
		    de->value.decimal_value = va_arg(value_ptr, double);
	    }
		break;
	    case STRINGTYPE:
	    {
		    de->value_type = STRINGTYPE;
		    string_value_ptr = va_arg(value_ptr, char *);
		    de->value.string_value = (char *)calloc (strlen(string_value_ptr) + 1, sizeof(char));
		    memcpy(de->value.string_value, string_value_ptr, strlen(string_value_ptr));
	    }
		break;
	    case OBJECTTYPE:
	    {
		    de->value_type = OBJECTTYPE;
		    de->value.object_value = va_arg(value_ptr, void *);
	    }
		break;
	    default:
	    {
		printf("value type is error.\n");
		return false;
	    }
		break;
	    }
	    de->next = d->hash_table[0].table[key_index];
	    d->hash_table[0].table[key_index] = de;
	    d->hash_table[0].used++;
	}
    }
    if (exist_key(d, key) == false)
    {
	    if (d->rehash_index != -1)
	    {
		key_index = murmurhash(key, (uint32_t )strlen(key), MMHASH_SEED);
		key_index = key_index & d->hash_table[1].size_mask;
		de = (dictEntry *)calloc(1, sizeof(dictEntry));
		de->key = (char *)calloc(strlen(key) + 1, sizeof(char));
		memcpy(de->key, key, strlen(key));
		switch (type) {
		case INTTYPE:
		{
			de->value_type = INTTYPE;
			de->value.num_value = va_arg(value_ptr, long);
		}
		    break;
		case DECIMALTYPE:
		{
			de->value_type = DECIMALTYPE;
			de->value.decimal_value = va_arg(value_ptr, double);
		}
		    break;
		case STRINGTYPE:
		{
			de->value_type = STRINGTYPE;
			string_value_ptr = va_arg(value_ptr, char *);
			de->value.string_value = (char *)calloc (strlen(string_value_ptr) + 1, sizeof(char));
			memcpy(de->value.string_value, string_value_ptr, strlen(string_value_ptr));
		}
		    break;
		case OBJECTTYPE:
		{
			de->value_type = OBJECTTYPE;
			de->value.object_value = va_arg(value_ptr, void *);
		    //can't delete value
		}
		    break;
		default:
		{
		    printf("value type is error.\n");
		    return false;
		}
		    break;
		}
		de->next = d->hash_table[1].table[key_index];
		d->hash_table[1].table[key_index] = de;
		d->hash_table[1].used++;
	    }

    }