예제 #1
0
void
printgen(Node *n)
{
	Node *t;
	if(n==0)
		return;
	if(n->t==NExprlist){
		printgen(n->l);
		printgen(n->r);
		return;
	}
	t=etypeoft(n);
	switch(t->o.t){
	case TArray:
	case TChan:
	case TProg:
	case TStruct:
		emit(Iprintary);
		break;
	case TChar:
		emit(Iprintchar);
		break;
	case TInt:
		emit(Iprintint);
		break;
	case TUnit:
		emit(Iprintunit);
		break;
	default:
		panic("printgen: bad type %t", t);
	}
}
예제 #2
0
void addentry(){
    	int i, s;
	/*Setting border color */
    	init_pair(2,COLOR_MAGENTA,COLOR_BLACK);
	attron(COLOR_PAIR(2));
	border(0,0,0,0, 0,0,0,0);
	refresh();
	attroff(COLOR_PAIR(2));
	refresh();
   	int fict, sh, ref, nonfict;
	FILE *fp;
	Book book;
    	char option = 'y';
   	clear();
	    	refresh();
    	while(option == 'y' || option == 'Y') {
    		printgen();
    		scanw("%d",&s);
			switch(s) {
				case FICTION :
						printfiction();
						scanw("%d",&fict);
				       		fp=fopen("Fiction.dat","ab+");
						if(getinfo(&book)){
							book.cat = categories[s - 1];
							book.subcat = fiction[fict - 1];
   						 	fseek(fp,0,SEEK_END);
   							fwrite(&book,sizeof(book),1,fp);
						        fclose(fp);
						}	
						break;
				case NONFICTION :
						fp=fopen("Nonfiction.dat","ab+");
                	        	        if(getinfo(&book) == 1){
                        	        	         book.cat = categories[s-1];
                                	        	 book.subcat = categories[s-1];
                     		                   	 fseek(fp,0,SEEK_END);
	                        	                 fwrite(&book,sizeof(book),1,fp);
	                                	         fclose(fp);
      		  	                        }
                	         	       break;
				case REFERENCE :
						printref();
						scanw("%d",&ref);
						fp=fopen("Reference.dat","ab+");
                     	          	        if(getinfo(&book) == 1){
                                        		 book.cat = categories[s-1];
                                        		 book.subcat = refer[ref - 1]; 
                                        		 fseek(fp,0,SEEK_END);
                            	            		 fwrite(&book,sizeof(book),1,fp);
                                	        	 fclose(fp);
                               			 }
                              			 break;
				case SELFHELP :
						printselfhelp();
						scanw("%d",&sh);
					 	fp=fopen("Selfhelp.dat","ab+");
                	                	if(getinfo(&book) == 1){
                        	                	 book.cat,categories[s-1];
                                	        	 book.subcat = selfhelp[sh - 1];
                                        		 fseek(fp,0,SEEK_END);
                                        		 fwrite(&book,sizeof(book),1,fp);
	                                       		 fclose(fp);
        	                	        }
                	               	        break;
				case MENU :
						mainmenu();
						return;
						break;
				default :
						printw("\n ----- Wrong option. Please select again -----\n");
						addentry();
						return;
			}
    		mvaddstr(10,16,"The record is sucessfully saved");
    		mvaddstr(11,16,"Add more ? (y/n) ");
		option = getch();
	}
	mvaddstr(12,16,"Press Enter to go to main menu");
	getch();
	mainmenu();
	refresh();
	return;
}
예제 #3
0
void searchentry() {
	system("clear");
	printw("#######");
	FILE *fp;
	Book b;
	int g, id, found = 0;
	char c, ch, option = 'y';
	char bname[20];
	init_pair(2, COLOR_YELLOW, COLOR_BLACK);
	attron(COLOR_PAIR(2));
	border(0,0,0,0, 0,0,0,0);
	refresh();
	attroff(COLOR_PAIR(2));
	refresh();
	mvaddstr(1,60," ~~~~~~ SEARCH BOOKS ~~~~~~");
	refresh();
	while(option == 'y' || option == 'Y') {
		mvaddstr(3,32,"A. Search by ID");
		mvaddstr(5,32,"B. Search by name");
		mvaddstr(7,32,"Enter your choice");
		fflush(stdin);
		scanw(" %c",&c);
		switch(c) {
			case 'A' :
				printgen();
				addstr("(Genre to be searched) ");
				scanw("%d", &g);
				switch(g) {
					case FICTION :
							fp = fopen("Fiction.dat","rb+");
							mvaddstr(13,32,"Enter  book id:");
							scanw("%d",&id);
							while(fread(&b, sizeof(b), 1, fp) == 1) {
								searchid(&b, fp, id, &found);
							}
							fclose(fp);
							if(!found)
								mvaddstr(14,32,"Record not found.");
							break;				
					case NONFICTION :
							 fp = fopen("Nonfiction.dat","rb+");
        	                        	         mvaddstr(13,32,"Enter  book id:");
                        	                	 scanw("%d",&id);
                                	        	 while(fread(&b, sizeof(b), 1, fp) == 1) {
                                        	        	searchid(&b, fp, id, &found);
                                        		 }
							 fclose(fp);
							 if(!found)
                                	                        mvaddstr(14,32,"Record not found.");
                                        		 break;
					 case REFERENCE :
							fp = fopen("Reference.dat","rb+");
                        	               		mvaddstr(13,32,"Enter  book id:");
                                	        	scanw("%d",&id);
	                                        	while(fread(&b, sizeof(b), 1, fp) == 1) {
        	                                        	searchid(&b, fp, id, &found);
                	                       		}
							fclose(fp);
							if(!found)
                                	                        mvaddstr(14,32,"Record not found.");
                                       			break;
					case SELFHELP :
							fp = fopen("Selfhelp.dat","rb+");
	        	                                mvaddstr(13,32,"Enter  book id:");
        	        	                        scanw("%d",&id);
                	        	                while(fread(&b, sizeof(b), 1, fp) == 1) {
                        	        	                searchid(&b, fp, id, &found);
                                	        	}
							fclose(fp);
							if(!found)
                                                	        mvaddstr(14,32,"Record not found.");
							break;
					case MENU :
							mainmenu();
							return;
							break;
					default :
							mvaddstr(13,32,"Wrong option. Press enter to search again. ");
							getch();
							refresh();
							searchentry();
							return;
						}
					break;
		
			case 'B' :
				printgen();
				scanw("%d",&g);
				 switch(g) {
	                                case FICTION :
	        	                                fp = fopen("Fiction.dat","rb+");
        	        	                        mvaddstr(13,32,"Enter book name:");
                	        	                getstr(bname);
                        	        	        while(fread(&b, sizeof(b), 1, fp) == 1) {
                        	                       		 searchname(&b, fp, bname, &found);
        	                        	        }
							fclose(fp);
							if(!found)
                                                                mvaddstr(14,32,"Record not found.");
                	                        	break;
                        	        case NONFICTION :
	                                	         fp = fopen("Nonfiction.dat","rb+");
        	                                	 mvaddstr(13,32,"Enter book name:");
	        	                                 getstr(bname);
        	        	                         while(fread(&b, sizeof(b), 1, fp) == 1) {
                	        	                        searchname(&b, fp, bname, &found);
                        	        	         }
							 fclose(fp);
							 if(!found)
                                                                mvaddstr(14,32,"Record not found.");
                                	        	 break;
	                                 case REFERENCE :
	        	                                fp = fopen("Reference.dat","rb+");
        	        	                        mvaddstr(13,32,"Enter book name:");
                	        	                getstr(bname);
                        	        	        while(fread(&b, sizeof(b), 1, fp) == 1) {
                                	        	        searchname(&b, fp, bname, &found);
                       	        		        }
							fclose(fp);	
                        	                	break;
	                                case SELFHELP :
	        	                                fp = fopen("Selfhelp.dat","rb+");
        	        	                        mvaddstr(13,32,"Enter  book name:");
                	        	                getstr(bname);
                        	        	        while(fread(&b, sizeof(b), 1, fp) == 1) {
                                	        	        searchname(&b, fp, bname, &found);
							}
							fclose(fp);
							if(!found)
                                                                mvaddstr(14,32,"Record not found.");
							break;
					case MENU :
							mainmenu();
							return;
							break;
					default :
							mvaddstr(13,32,"Wrong option. Press enter to search again ");
							getch();
							clear();
							refresh();
							searchentry();
							return;
					}
				break;
			default :
					mvaddstr(13,32,"Wrong option. Press enter to search again");
					getch();
					refresh();
					clear();
					refresh();
					searchentry();
					return;
		}
		mvaddstr(21,16,"Search again ? (y/n) ");
		scanw("%c", &option);
		clear();
		refresh();
	}
	mvaddstr(22,16,"Press enter to return to main menu");
	getch();
	mainmenu();
	return;
}
예제 #4
0
void
gen(Node *n, int retain)
{
	int i;

	if(n==0)
		return;
	switch(n->t){
	case NArrayref:
		arygen(n->l, n->r, 0, 0L);
		if(!retain)
			popgen(n->l->o.s->val->type->r);
		return;
	case NBecome:
		didbecome=1;
		if(n->l->t==NCall && !bflag){
			callgen(n->l, Ibecome);
			return;
		}
		gen(n->l, 1);
		n=n->r;
		if(n->o.t==TID)
			n=typeoftid(n);
		switch(n->o.t){
		case TInt:
		case TChar:
			emit(Istoreauto);
			emitconst(-WS*(4+length(formals)));
			break;
		case TArray:
		case TChan:
		case TProg:
		case TStruct:
			emit(Istoreptrauto);
			emitconst(-WS*(4+length(formals)));
			break;
		case TUnit:
			break;
		default:
			panic("can't compile %t become", n);
		}
		scopedecrefgen();
		trlrgen();
		return;
	case NBegin:
		callgen(n->l, Ibegin);
		return;
	case NBreak:
		if(breakloc==-1)
			lerror(n, "break not in loop");
		if(breakloc)	/* chain previous break to here */
			patch(breakloc, (long)(here()-breakloc-1)*WS);
		emit(Ijmp);
		breakloc=here();
		emitconst(0L);
		return;
	case NCall:
		callgen(n, Icall);
		if(!retain)
			popgen(etypeoft(n->l)->r);
		return;
	case NComplete:
		gen(n->l, retain);
		return;
	case NContinue:
		if(continueloc==-1)
			lerror(n, "continue not in loop");
		if(continueloc)	/* chain previous continue to here */
			patch(continueloc, (long)(here()-continueloc-1)*WS);
		emit(Ijmp);
		continueloc=here();
		emitconst(0L);
		return;
	case NDecl:
	case NDeclsc:
		declare(n, 0, 0, 1);
		return;
	case NExpr:
		switch(n->o.i){
		case GE:
			i=Ige;
		Binop:
			gen(n->l, 1);
			gen(n->r, 1);
			if(eqtype(etypeof(n->l), &arychartype)){
				emit(Istrcmp);
				constgen(0L);
			}
			emit(i);
		Popit:
			if(!retain)
				emit(Ipop);
			return;
		case LE:
			i=Ile;
			goto Binop;
		case NE:
			i=Ine;
			goto Binop;
		case EQ:
			i=Ieq;
			goto Binop;
		case '>':
			i=Igt;
			goto Binop;
		case '<':
			i=Ilt;
			goto Binop;
		case '+':
			i=Iadd;
			goto Binop;
		case '-':
			i=Isub;
			goto Binop;
		case '*':
			i=Imul;
			goto Binop;
		case '/':
			i=Idiv;
			goto Binop;
		case '%':
			i=Imod;
			goto Binop;
		case '&':
			i=Iand;
			goto Binop;
		case '|':
			i=Ior;
			goto Binop;
		case '^':
			i=Ixor;
			goto Binop;
		case LSH:
			i=Ilsh;
			goto Binop;
		case RSH:
			i=Irsh;
			goto Binop;
		case ANDAND:
			condgen(n->l, n->r, Ijmptrue, Ijmpfalse, 0L, 1L, retain);
			return;
		case OROR:
			condgen(n->l, n->r, Ijmpfalse, Ijmptrue, 1L, 0L, retain);
			return;
		case CAT:
			gen(n->l, 1);
			gen(n->r, 1);
			emit(Icat);
			return;
		case DEL:
			gen(n->l, 1);
			gen(n->r, 1);
			emit(Idel);
			return;
		case PRINT:
			gen(n->l, 1);
			printgen(n->l);
			emit(Isprnt);
			if(!retain)
				emit(Iprint);
			return;
		case SND:
			gen(n->l, 1);
			constgen((long)Cissnd);
			emit(Icommset1);
			emit(Icommcln1);
			gen(n->r, 1);
			if(isptrtype(etypeoft(n->l)->r))
				emit(Isndptr);
			else
				emit(Isnd);
			if(!retain)
				popgen(etypeof(n));
			return;
		case RCV:
			gen(n->l, 1);
			constgen(0L);	/* not Cissnd */
			emit(Icommset1);
			emit(Icommcln1);
			if(!retain)
				popgen(etypeof(n));
			return;
		case '=':
			gen(n->r, 1);
			if(retain)
				dupgen(etypeof(n->r), 1);
			lgen(n->l);
			return;
		case LEN:
			gen(n->l, 1);
			emit(Ilen);
			goto Popit;
		case REF:
			if(isptrtype(etypeof(n->l))){
				gen(n->l, 1);
				emit(Iref);
			}else
				constgen(1L);
			goto Popit;
		case DEF:
			if(retain && n->l->t==NID && isinttype(etypeof(n->l))){
				constgen(1L);
				return;
			}
			/*
			 * don't really need to call lgen1, which will uniquify our
			 * array for us, but it does no harm, and it's easy.
			 */
			lgen1(n->l, Idefauto, Idef, Idefary);
			goto Popit;
		case UMINUS:
			gen(n->l, 1);
			emit(Ineg);
			goto Popit;
		case '~':
			gen(n->l, 1);
			emit(Inot);
			goto Popit;
		case '!':
			gen(n->l, 1);
			emit(Ilnot);
			goto Popit;
		case INC:
			lgen1(n->l, Iincauto, Iinc, Iincary);
			goto Popit;
		case DEC:
			lgen1(n->l, Idecauto, Idec, Idecary);
			goto Popit;
		default:
			panic("can't compile %e expression", n);
		}

	case NExprlist:
		/*
		 * This is an arg or element list; first is pushed last
		 */
		gen(n->r, 1);
		gen(n->l, 1);
		return;
	case NID:
		if(!retain)
			return;
		switch(type_of(n)->o.t){
		case TInt:
		case TChar:
			if(n->o.s->val->isauto){
				emit(Ipushauto);
				emitconst(n->o.s->val->store.off);
			}else{
				emit(Ipush);
				emitconst((long)&n->o.s->val->store.l);
			}
			return;
		case TProg:
		case TArray:
		case TChan:
		case TStruct:
			if(n->o.s->val->isauto){
				emit(Ipushptrauto);
				emitconst(n->o.s->val->store.off);
			}else{
				emit(Ipushptr);
				emitconst((long)&n->o.s->val->store.l);
			}
			return;
		case TUnit:
			if(retain)
				constgen(0L);
			return;
		case TType:
			lerror(n, "attempt to evaluate type variable %m", n);
		default:
			panic("can't compile type %t", n->o.s->val->type);
		}
	case NIf:
		ifgen(n);
		return;
	case NList:
		gen(n->l, 0);
		gen(n->r, 0);
		return;
	case NLoop:
		loopgen(n);
		return;
	case NMk:
		mkgen(n->l, n->r);
		return;
	case NNum:
		if(retain)
			constgen(n->o.l);
		return;
	case NProg:
		if(retain)
			proggen(n->l, n->r);
		return;
	case NResult:
		if(resultloc==0)
			lerror(n, "result not in val");
		gen(n->l, 1);
		emit(Ijmp);
		emitconst((long)(resultloc-here()-1)*WS);
		return;
	case NScope:
		pushscope();
		if(nscope==1){
			int nauto;
			autooffset=0;
			emit(Ipushfp);
			nauto=here();
			emitconst(0L);
			gen(n->l, 0);
			patch((int)nauto, autooffset);
			emit(Ipop);	/* Ipopfp() */
		}else
			gen(n->l, 0);
		scopedecrefgen();
		popscope();
		return;
	case NSelect:
		selgen(n->l);
		return;
	case NSmash:{
		Value *vl, *vr;
		vl=n->l->o.s->val;
		vr=n->r->o.s->val;
		if(vr->type->o.t==TType){
			freenode(vl->type);
			vl->type=dupnode(vr->type);
			return;
		}
		gen(n->r, 1);
		/*
		 * Free old values; tricky: push as int, pop as ptr
		 */
		if(isptrtype(vl->type)){
			if(vl->isauto){
				emit(Ipushauto);
				emitconst(vl->store.off);
			}else{
				emit(Ipush);
				emitconst((long)&vl->store.l);
			}
			emit(Ipopptr);
		}
		if(vl->isauto){
			emit(Istoreauto);
			emitconst(vl->store.l);
			return;
		}
		emit(Istore);
		emitconst((long)&vl->store.l);
		return;
	}
	case NString:
		if(retain){
			emit(Ipushdata);
			emitconst((long)n->o.st);
			emitstore(n->o.st);
			n->o.st->ref++;
		}
		return;
	case NStructref:
		arygen(n->l, n->r, 1, n->o.l);
		return;
	case NSwitch:
		switchgen(n->l, n->r);
		return;
	case NUnit:
		if(retain)
			constgen(0L);
		return;
	case NVal:
		valgen(n->l);
		if(!retain)
			popgen(n->o.n);
		return;
	}
	panic("can't compile node %n", n);
	return;
}
예제 #5
0
void editentry() {
    system("clear");
    init_pair(2,COLOR_MAGENTA,COLOR_BLACK);
    attron(COLOR_PAIR(2));
    border(0,0,0,0, 0,0,0,0);
    attroff(COLOR_PAIR(2));
    mvaddstr(1,60,"~~~~~~ EDIT BOOK RECORDS ~~~~~~");
    int id, c;
    char option = 'y';
    Book b;
    FILE *fp;
    while(option == 'y' || option == 'Y') {
        printgen();
        scanw("%d",&c);
        switch(c) {
        case FICTION :
            fp = fopen("Fiction.dat","rb+");
            mvaddstr(13,32,"Enter book id : ");
            scanw("%d",&id);
            refresh();
            while(fread(&b, sizeof(b), 1, fp) == 1) {
                edit(&b, fp, id);
            }
            fclose(fp);
            if(foundd == 0)
                mvaddstr(15,32,"Record not found");
            break;
        case NONFICTION :
            fp = fopen("Nonfiction.dat","rb+");
            mvaddstr(13,32,"Enter book id : ");
            scanw("%d",&id);
            while(fread(&b, sizeof(b), 1, fp) == 1) {
                edit(&b, fp, id);
            }
            fclose(fp);
            if(foundd == 0)
                mvaddstr(15,32,"Record not found");
            break;
        case REFERENCE :
            fp = fopen("Reference.dat","rb");
            mvaddstr(13,32,"Enter book id : ");
            scanw("%d",&id);
            while(fread(&b, sizeof(b), 1, fp) == 1) {
                edit(&b, fp, id);
            }
            fclose(fp);
            if(foundd == 0)
                mvaddstr(15,32,"Record not found");
            break;
        case SELFHELP :
            fp = fopen("Selfhelp.dat","rb");
            mvaddstr(13,32,"Enter book id : ");
            scanw("%d",&id);
            while(fread(&b, sizeof(b), 1, fp) == 1) {
                edit(&b, fp, id);
            }
            fclose(fp);
            if(foundd == 0)
                mvaddstr(15,32,"Record not found");
            break;
        case MENU :
            mainmenu();
            return ;
            break;
        }
        mvaddstr(23,32,"Edit more? (y/n) ");
        scanw("%c", &option);
    }
    mvaddstr(24,32,"Press ENTER to return to main menu");
    getch();
    refresh();
    mainmenu();
}