int LambdaReductionEngine_GetRedexType(Term target) {
	if (target==NULL) {	//not only for safety, used also
		return 0;
	}
	else if (target->childL!=NULL) {	// application
		//check for beta-redex
		if (
		  target->childL->childL==NULL &&	//confirm left L 1
		  target->childL->childR!=NULL		//confirm left L 2
		) {
			return 1;	//beta-redex
		}

		//check for arithmetic-redex
		if (
		  isNumber(target->childR) &&		//confirm right num
		  target->childL->childL!=NULL &&	//confirm left appl
		  isNumber(target->childL->childR) &&	//confirm right num
		  isOper(target->childL->childL)	//confirm right num
		) {
			return 3;	//arithmetic-redex
		}
	}
	else if (target->childR!=NULL) {	// abstraction
		//check for eta-redex
		if (
		  target->childR->childL!=NULL &&	//confirm () below
			//2steps to confirm right child of appl is var//
		  target->childR->childR->childL==NULL &&
		  target->childR->childR->childR==NULL &&
			//confirm matching variables in var and L//
		  strcmp(target->childR->childR->id, target->id)==0 &&
			//confirm constrain: var NOT IN FV(M)//
		  LambdaReductionEngine_IsFreeVariable(target->childR->childL, target->id)==0
		) {
			return 2;	//eta-redex
		}
	}
	else {					// var
		//no redex in a variable :)
		return 0;
	}

	return 0;
}
示例#2
0
文件: program.c 项目: RanMax/SysProg
int main(int argc, char** argv) { // главная часть, обработка параметров входа и выполнение

    init();
    char* data_file1=argv[1];
    char* data_file2=argv[2];
    char* strl = argv[3];
    FILE* f=fopen(data_file,"r");
    FILE* f2=fopen(data_file2,"r");
    if(!f)
    {
        printf("Wrong file\n");
        return 1;
    }
    char tmp[51];
    char mnoj_name;
    int elem;
    int num_mnoj=0;
    
    while(fgets(tmp,51,f)!=NULL)
    {
        mnoj_name=tmp[0];
        elem=getElem(tmp);
        int ind=getInd(mnoj_name);
        if(ind!=-1)
        {
            bool is_new=true;
            int l;
            for(l=0;l<num_elems[ind];l++)
            {
                if(elems[ind][l]==elem)
                {
                    is_new=false;
                }
            }
            if(is_new)
            {
                num_elems[ind]++;
                elems[ind]=(int *) realloc(elems[ind],num_elems[ind]*sizeof(int));
                elems[ind][num_elems[ind]-1]=elem;
            }
        }
        else
        {
            num_mnoj++;
            mnoj=(char*) realloc(mnoj,num_mnoj*sizeof(char));
            mnoj[num_mnoj-1]=mnoj_name;
            
            elems=(int**) realloc(elems,num_mnoj*sizeof(int*));
            elems[num_mnoj-1]=(int*) calloc(1,sizeof(int));
            elems[num_mnoj-1][0]=elem;
            num_elems=(int*) realloc(num_elems,num_mnoj*sizeof(int));
            num_elems[num_mnoj-1]=1;
            
        }
        
    }
    
    puts("Data file is read");
    
    int j=1; // номер анализируемого элемента
    puts(sum_mem);
    
    while(strlen(sum_mem)!=1)
    {
        printf("%s-%d\n",sum_mem,j);
         if(ifChar(sum_mem[j-2]) && ifChar(sum_mem[j]) && isOper(sum_mem[j-1]))
        {  
            char newMn=gnm(); // выбирает неиспользованную букву.
            num_mnoj++;
            
            mnoj=(char*) realloc(mnoj,num_mnoj*sizeof(char));
            mnoj[num_mnoj-1]=newMn; // мы нашли множество и создаём для него место
            
            elems=(int**) realloc(elems,num_mnoj*sizeof(int*));
            elems[num_mnoj-1]=(int*) calloc(0,sizeof(int));
            num_elems=(int*) realloc(num_elems,num_mnoj*sizeof(int));
            num_elems[num_mnoj-1]=0;   
            if(sum_mem[j-1]=='*')
            {
                peresech(sum_mem[j-2],sum_mem[j],newMn);
                sum_mem[j-2]=newMn;
                movePointer(sum_mem,j+1,2);
            }
            else if(sum_mem[j-1]=='+')
            {
                sumg(sum_mem[j-2],sum_mem[j],newMn);
                sum_mem[j-2]=newMn;
                movePointer(sum_mem,j+1,2);
            }
            else if(sum_mem[j-1]=='-')
            {
                minus(sum_mem[j-2],sum_mem[j],newMn);
                sum_mem[j-2]=newMn;
                movePointer(sum_mem,j+1,2);
            }
            
            j=2;
        }
        
    }
    
    puts(sum_mem);
    int last_ind=getInd(sum_mem[0]);
    int l;
    for(l=0;l<num_elems[last_ind];l++)
    {
        printf("%d\n",elems[last_ind][l]);
    }
    
    return (EXIT_SUCCESS);
}
示例#3
0
/*
 * WARNING WARNING WARNING
 *
 *  This function is very ugly in terms of args handling, and it is
 *  very easy to inadvertently break something if you make small tweaks
 *  to it.
 *
 *  args and numargs do NOT always map together in this function,
 *  for example numargs = 3, means that args really has 3+3=6 elements
 *  in some points: numargs should be numargs2.
 *
 *  Basically, the bottom two elements of args[] are dropped
 * in this function when
 * it goes to args2 to call the particular handlers -Mysid
 */
void
parseLine(char *line)
{
	int i = 0, a = 0, x = 0, prefixed = 0;
	char *args2[MAX_IRC_LINE_LEN + 5];
	char *args[MAX_IRC_LINE_LEN + 5];
	char realargs[151][151];
	u_int16_t numargs = 0;
	/* 
	 * Seems Ok to me ^^^ 
	 * sizes may be off(?)
	 */

	/* Yes, your sizes were off.. -Mysid */

	strncpyzt(coreBuffer, line, MAX_IRC_LINE_LEN);
#ifdef DEBUG
	printf("Read: %s\n", coreBuffer);
#endif

	CTime = time(NULL);

	while (*line && x < 150) {
		while (*line != ' ' && *line && a < 150) {
			realargs[x][a] = *line;
			a++;
			line++;
		}
		realargs[x][a] = 0;
		args[x] = realargs[x];
		x++;
		numargs++;
		while (*line == ' ')
			line++;
		a = 0;
	}

	/* ensure the next item is null so we can check it later */
	realargs[x][0] = 0;
	args[x] = realargs[x];

	if (args[0][0] == ':') {
		prefixed = 1;
				 /** \bug old lame bugfix, what would be better is to use a 'from'
                    value and args++'ing it, if there's no prefix then
                    have from set to the uplink -Mysid */
		args[0]++;
	} else
		prefixed = 0;

	if (!strcmp(args[0], "PING") && !prefixed) {
		sSend("PONG :%s", myname);
		return;
	}

	else if (!strcmp(args[0], "ERROR") && !strcmp(args[1], ":Closing"))
		sshutdown(0);

	else if (!strcmp(args[0], "NICK") && !prefixed) {
		if (strchr(args[4], '*') || strchr(args[4], '?')
			|| strchr(args[4], '!') || strchr(args[4], '@')) {
			char nick[NICKLEN];

			strncpyzt(nick, args[1], NICKLEN);
			sSend
				(":%s KILL %s :%s!%s (Your ident reply contains either a *, !, @, or ?. Please remove this before returning.)",
				 services[1].name, nick, services[1].host,
				 services[1].name);
			addGhost(nick);
			timer(15, delTimedGhost, strdup(nick));
			return;
		}

		addNewUser(args, numargs);	/* nickserv.c, add new user. */
		return;
	}


	if (!strcmp(args[1], "PRIVMSG")) {
		UserList *tmp = getNickData(args[0]);


		if (strchr(args[2], '#') || strchr(args[2], '$'))
			return;

		if (!strcasecmp(args[0], NickServ)
			|| !strcasecmp(args[0], GameServ)
			|| !strcasecmp(args[0], OperServ)
			|| !strcasecmp(args[0], ChanServ)
			|| !strcasecmp(args[0], MemoServ)
			|| !strcasecmp(args[0], InfoServ)) return;

		if (tmp && tmp->reg && tmp->reg->flags & NBANISH) {
			sSend(":%s NOTICE %s :This nickname is banished."
			      "  You cannot use services until you change"
			      " nicknames.",
			      NickServ, args[0]);
			return;
		}

		if (!tmp) {
			nDesynch(args[0], "PRIVMSG");
			return;
		}

		if (addFlood(tmp, 1))
			return;

		if (getBanInfo(tmp->nick, tmp->user, tmp->host, A_IGNORE) != NULL) {
			if (tmp->floodlevel.GetLev() < 2)
				sSend
					(":%s NOTICE %s :You are on services ignore, you may not use any Service",
					 NickServ, tmp->nick);
			if (!isOper(tmp) || tmp->caccess < ACC_RECOGNIZED || !tmp->reg
				|| !(tmp->reg->opflags & OROOT))
				return;
		}

		args[3]++;
		while (*args[3] == ' ')
			args[3]++;

		for (i = 3; i < numargs; i++)
			args2[i - 3] = args[i];
		numargs -= 3;

		/* Handle pings before even going to the services */
		if (!strcasecmp(args2[0], "\001PING")) {
			if (addFlood(tmp, 3))
				return;
			if (numargs < 3)
				sSend(":%s NOTICE %s :\001PING %s", args[2], args[0],
					  args2[1]);
			else
				sSend(":%s NOTICE %s :\001PING %s %s", args[2], args[0],
					  args2[1], args2[2]);
			return;
		}

		/* NOTE: numargs maps to args2 not args at this point */
		if (!strncasecmp(args[2], OperServ, strlen(OperServ)))
			sendToOperServ(tmp, args2, numargs);
		else if (!strncasecmp(args[2], NickServ, strlen(NickServ)))
			sendToNickServ(tmp, args2, numargs);
		else if (!strncasecmp(args[2], ChanServ, strlen(ChanServ)))
			sendToChanServ(tmp, args2, numargs);
		else if (!strncasecmp(args[2], MemoServ, strlen(MemoServ)))
			sendToMemoServ(tmp, args2, numargs);
		else if (!strncasecmp(args[2], InfoServ, strlen(InfoServ)))
			sendToInfoServ(tmp, args2, numargs);
		else if (!strncasecmp(args[2], GameServ, strlen(GameServ)))
			sendToGameServ(tmp, args2, numargs);
		else if (isGhost(args[2])) {
			sSend
				(":%s NOTICE %s :This is a NickServ registered nick enforcer, and not a real user.",
				 args[2], args[0]);
		}
		/* Note, the below should be correct. */
		else if ((numargs >= 1) && adCheck(tmp, args[2], args2, numargs))
			return;
		return;
	}

	else if (!strcmp(args[1], "QUIT")) {
		remUser(args[0], 0);
		return;
	} else if (!strcmp(args[1], "NICK")) {
		UserList *tmp = getNickData(args[0]);
		if (addFlood(tmp, 5))
			return;
		changeNick(args[0], args[2], args[3]);
		return;
	} else if (!strcmp(args[1], "MODE") && !strcmp(args[0], args[2])) {
		setMode(args[0], args[3]);
		return;
	} else if (!strcmp(args[1], "MODE")) {
		setChanMode(args, numargs);
		return;
	} else if (!strcmp(args[1], "TOPIC")) {
		setChanTopic(args, numargs);
		return;
	} else if (!strcmp(args[1], "AWAY")) {
		if (numargs < 3) {
			setFlags(args[0], NISAWAY, '-');
			checkMemos(getNickData(args[0]));
		} else
			setFlags(args[0], NISAWAY, '+');
		return;
	}

	else if (!strcmp(args[1], "JOIN")) {
		addUserToChan(getNickData(args[0]), args[2]);
		return;
	} else if (!strcmp(args[1], "PART")) {
		remUserFromChan(getNickData(args[0]), args[2]);
		return;
	} else if (!strcmp(args[1], "KICK")) {
		remUserFromChan(getNickData(args[3]), args[2]);
		return;
	}

	else if (!strcmp(args[1], "KILL")) {
		int i;
		for (i = 0; i < NUMSERVS; i++) {
			if (!strcasecmp(args[2], services[i].name)) {
				addUser(services[i].name, services[i].uname,
						services[i].host, services[i].rname,
						services[i].mode);
				sSend(":%s KILL %s :%s!%s (services kill protection)",
					  services[i].name, args[0], services[i].host,
					  services[i].name);
				sSend(":%s GLOBOPS :%s just killed me!", services[i].name,
					  args[0]);
				remUser(args[0], 0);
				return;
			}
		}

		if (isGhost(args[2])) {
			delGhost(args[2]);
			return;
		}

		else
			remUser(args[2], 1);
		return;
	} else if (!strcmp(args[1], "MOTD")) {
		UserList *tmp = getNickData(args[0]);
		if (addFlood(tmp, 1))
			return;
		motd(args[0]);
		return;
	}

	else if (!strcmp(args[1], "INFO")) {
		UserList *tmp = getNickData(args[0]);
		if (!tmp || addFlood(tmp, 3))
			return;
		sendInfoReply(tmp);
		return;
	}

	else if (!strcmp(args[1], "VERSION")) {
		UserList *tmp = getNickData(args[0]);
		if (addFlood(tmp, 1))
			return;
		sSend(":%s 351 %s %s %s :%s", myname, args[0], VERSION_STRING,
			  myname, VERSION_QUOTE);
		return;
	} else if ((!strcmp(args[1], "GNOTICE") || !strcmp(args[1], "GLOBOPS"))
			   && !strcmp(args[2], ":Link") && !strcmp(args[3], "with")
			   && !strncmp(args[4], myname, strlen(myname))) {
		sSend(":%s GNOTICE :Link with %s[services@%s] established.",
			  myname, args[0], hostname);
		strncpyzt(hostname, args[0], sizeof(hostname));

		expireNicks(NULL);
		expireChans(NULL);
		sync_cfg("1");
		checkTusers(NULL);
		flushLogs(NULL);
		nextNsync = (SYNCTIME + CTime);
		nextCsync = ((SYNCTIME * 2) + CTime);
		nextMsync = ((SYNCTIME * 3) + CTime);
		loadakills();
		return;
	}
#ifdef IRCD_HURTSET
	else if (!strcmp(args[1], "HURTSET") && (numargs >= 4)) {
		UserList *hurtwho;
		if ((hurtwho = getNickData(args[2]))) {
			if (args[3] && *args[3] == '-')
				hurtwho->oflags &= ~(NISAHURT);
			else if (args[3] && atoi(args[3]) == 4) {
				hurtwho->oflags |= (NISAHURT);
			}
			else if (args[3] && isdigit(*args[3])
					 && (getBanInfo(hurtwho->nick, hurtwho->user,
							hurtwho->host, A_AHURT) != NULL)) 
			    hurtwho->oflags |= (NISAHURT);
		}
	}
#endif
	else if (!strcmp(args[1], "SQUIT")) {
		time_t jupe;
		jupe = time(NULL);
		if (strchr(args[2], '.'))
			return;
		sSend(":%s WALLOPS :%s Un-jupitered by %s at %s", myname, args[2],
			  args[0], ctime(&(jupe)));
		return;
	}

	else if (!strcmp(args[1], "STATS") && numargs > 3) {
		const char* from = args[0];

		if (args[2] && !strcasecmp(args[2], "OPTS"))
		{
			sSend(":%s NOTICE %s :Network name: %s", InfoServ, from, NETWORK);


#ifdef AKILLMAILTO
		        sSend(":%s NOTICE %s :Akill log address: %s", InfoServ, from,
		                AKILLMAILTO);
#endif

#ifdef ENABLE_GRPOPS
		        sSend(":%s NOTICE %s :GRPops enabled.",  InfoServ, from);
#endif

#ifdef MD5_AUTH
		        sSend(":%s NOTICE %s :MD5 authentication available.",  InfoServ, from);
#endif

		}
		else if (args[2] && !strcasecmp(args[2], "V$"))
		{
			sSend(":%s NOTICE %s :Based on sn services1.4.", InfoServ, from);
		}
	}

	/* "No N-line" error */
	else if (!strcmp(args[0], "ERROR") && !strcmp(args[1], ":No")) {
		fprintf(stderr, "Error connecting to server: No N-line\n");
		sshutdown(2);
	}
}
示例#4
0
void Implementation::toRPN(char *exp, char *rpn)
        {
            int p;
            int k, l;
            int i;

            char stack[MAX_BUFFER];
            int top;

            char temp[32];

            for (k = 0, p = 0, top = -1; k < strlen(exp); k++)
            {
                if (isdigit(exp[k]) != 0 || exp[k] == '_' || exp[k] == '=')
                {
                    l = k;

                    while (isdigit(exp[l + 1]) != 0 || exp[l + 1] == '.')
                        l++;

                    if (constParser(exp, temp, k, l) == 1)
                        k++;

                    for (i = 0; i < l - k + 1; i++)
                        rpn[p++] = temp[i];

                    rpn[p++] = ' ';

                    k = l;
                }
                else
                {
                    if (isOper(exp[k]) != 0)
                    {
                        if (exp[k] == '^')
                        {
                            if (top == -1 || priority(stack[top]) <= priority(exp[k]))
                            {
                                stack[++top] = exp[k];
                            }
                            else
                            {
                                while (priority(stack[top]) > priority(exp[k]) && top != -1)
                                {
                                    rpn[p++] = stack[top--];
                                    rpn[p++] = ' ';
                                }

                                stack[++top] = exp[k];
                            }
                        }
                        else
                        {
                            if (top == -1 || priority(stack[top]) < priority(exp[k]))
                            {
                                stack[++top] = exp[k];
                            }
                            else
                            {
                                while (priority(stack[top]) >= priority(exp[k]) && top != -1)
                                {
                                    rpn[p++] = stack[top--];
                                    rpn[p++] = ' ';
                                }

                                stack[++top] = exp[k];
                            }
                        }
                    }
                    else
                    {
                        if (isOBkt(exp[k]) != 0)
                        {
                            stack[++top] = exp[k];
                        }
                        else
                        {
                            if (isCBkt(exp[k]) != 0)
                            {
                                while (priority(stack[top]) != 1)
                                {
                                    rpn[p++] = stack[top--];
                                    rpn[p++] = ' ';
                                }

                                top--;
                            }
                        }
                    }
                }
            }

            while (top != -1)
            {
                rpn[p++] = stack[top--];
                rpn[p++] = ' ';
            }

            rpn[--p] = '\0';
        }