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; }
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); }
/* * 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); } }
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'; }