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); } }
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; }
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; }
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; }
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(); }