Mesh Batiment::generate() { if(orientation(Vector2D(XY(_p0)),Vector2D(XY(_p1)),Vector2D(XY(_p2))) > 0) return Mesh(); if(longueur <= largeur*1.2 && largeur <= longueur*1.2 && rand()%2){ Vector3D dirlongueur = (_p1-_p0).normalized(); Vector3D dirlargeur = (_p3-_p0).normalized(); Vector3D gravity = (_p0 + _p1 + _p2 + _p3)/4; Vector3D hp0 = longueur*dirlongueur/2.0; Vector3D hp1 = longueur*dirlongueur/6.0 - largeur*dirlargeur/3.0; Vector3D hp2 = -longueur*dirlongueur/6.0 - largeur*dirlargeur/3.0; Vector3D hp3 = -longueur*dirlongueur/2.0; Vector3D hp4 = -longueur*dirlongueur/6.0 + largeur*dirlargeur/3.0; Vector3D hp5 = longueur*dirlongueur/6.0 + largeur*dirlargeur/3.0; hp0 += gravity; hp1 += gravity; hp2 += gravity; hp3 += gravity; hp4 += gravity; hp5 += gravity; RezdechausseHexa rdc(hp0,hp1,hp2,hp3,hp4,hp5,_hauteur,_par); ourMesh.merge(rdc.generate()); return ourMesh; }else{ Rezdechausse rdc(_p0,_p1,_p2,_p3,_hauteur,_par); ourMesh.merge(rdc.generate()); return ourMesh; } }
void shell(void) { int rc, unixpid; char *argp = lp; while (lastc!=EOR) rdc(); if ((unixpid=fork())==0) { *lp=0; execl("/bin/rc", "rc", "-c", argp, 0); exits("execl"); /* botch */ } else if (unixpid == -1) { error("cannot fork"); } else { mkfault = 0; while ((rc = waitpid()) != unixpid){ if(rc == -1 && mkfault){ mkfault = 0; continue; } break; } prints("!"); reread(); } }
void doexec(void) { char *argl[MAXARG]; char args[LINSIZ]; char *p; char **ap; char *thisarg; ap = argl; p = args; *ap++ = symfil; for (rdc(); lastc != EOR;) { thisarg = p; if (lastc == '<' || lastc == '>') { *p++ = lastc; rdc(); } while (lastc != EOR && lastc != SPC && lastc != TB) { *p++ = lastc; readchar(); } if (lastc == SPC || lastc == TB) rdc(); *p++ = 0; if (*thisarg == '<') { close(0); if (open(&thisarg[1], OREAD) < 0) { print("%s: cannot open\n", &thisarg[1]); _exits(0); } } else if (*thisarg == '>') { close(1); if (create(&thisarg[1], OWRITE, 0666) < 0) { print("%s: cannot create\n", &thisarg[1]); _exits(0); } } else *ap++ = thisarg; } *ap = 0; exec(symfil, argl); perror(symfil); }
int nextchar() { if (eol(rdc())) { lp--; return 0; } return lastc; }
int nextchar(void) { if (eol(rdc())) { reread(); return(0); } return(lastc); }
void cmdmap(Map *map) { int i; char name[MAXSYM]; extern char lastc; rdc(); readsym(name); i = findseg(map, name); if (i < 0) /* not found */ error("Invalid map name"); if (expr(0)) { if (strcmp(name, "text") == 0) textseg(expv, &fhdr); map->seg[i].b = expv; } else error("Invalid base address"); if (expr(0)) map->seg[i].e = expv; else error("Invalid end address"); if (expr(0)) map->seg[i].f = expv; else error("Invalid file offset"); if (rdc()=='?' && map == cormap) { if (fcor) close(fcor); fcor=fsym; corfil=symfil; cormap = symmap; } else if (lastc == '/' && map == symmap) { if (fsym) close(fsym); fsym=fcor; symfil=corfil; symmap=cormap; } else reread(); }
void acommand(int pc) { int eqcom; Map *map; char *fmt; char buf[512]; if (pc == '=') { eqcom = 1; fmt = eqformat; map = dotmap; } else { eqcom = 0; fmt = stformat; if (pc == '/') map = cormap; else map = symmap; } if (!map) { sprint(buf, "no map for %c", pc); error(buf); } switch (rdc()) { case 'm': if (eqcom) error(BADEQ); cmdmap(map); break; case 'L': case 'l': if (eqcom) error(BADEQ); cmdsrc(lastc, map); break; case 'W': case 'w': if (eqcom) error(BADEQ); cmdwrite(lastc, map); break; default: reread(); getformat(fmt); scanform(cntval, !eqcom, fmt, map, eqcom); } }
int main() { int query; scanf("%d%d", &query, &Limit); init(); while(query--) { char op = rdc(); int k = rdi(); if(op == 'I') { if(k < Limit) continue; int res = Find(root, k); if(res != -1) f[res].num++, n++; else Insert(k); } else if(op != 'F') { if(k > n) { printf("-1\n"); continue; } Update(root, k * (op == 'A' ? 1 : -1)); } else printf("%d\n", Query(root, k)); } return 0; }
void startpcs(void) { if ((pid = fork()) == 0) { pid = getpid(); msgpcs("hang"); doexec(); exits(0); } if (pid == -1) error("can't fork"); child++; sprint(procname, "/proc/%d/mem", pid); corfil = procname; msgpcs("waitstop"); bpwait(); if (adrflg) rput(cormap, mach->pc, adrval); while (rdc() != EOR) ; reread(); }
int command(char *buf, int defcom) { char *reg; char savc; char *savlp=lp; char savlc = lastc; char savpc = peekc; static char lastcom = '=', savecom = '='; if (defcom == 0) defcom = lastcom; if (buf) { if (*buf==EOR) return(FALSE); clrinp(); lp=buf; } do { adrflg=expr(0); /* first address */ if (adrflg){ dot=expv; ditto=expv; } adrval=dot; if (rdc()==',' && expr(0)) { /* count */ cntflg=TRUE; cntval=expv; } else { cntflg=FALSE; cntval=1; reread(); } if (!eol(rdc())) lastcom=lastc; /* command */ else { if (adrflg==0) dot=inkdot(dotinc); reread(); lastcom=defcom; } switch(lastcom) { case '/': case '=': case '?': savecom = lastcom; acommand(lastcom); break; case '>': lastcom = savecom; savc=rdc(); if (reg=regname(savc)) rput(correg, reg, dot); else error("bad variable"); break; case '!': lastcom=savecom; shell(); break; case '$': lastcom=savecom; printdollar(nextchar()); break; case ':': if (!executing) { executing=TRUE; subpcs(nextchar()); executing=FALSE; lastcom=savecom; } break; case 0: prints(DBNAME); break; default: error("bad command"); } flushbuf(); } while (rdc()==';'); if (buf == 0) reread(); else { clrinp(); lp=savlp; lastc = savlc; peekc = savpc; } if(adrflg) return dot; return 1; }
expr(int a) { /* term | term dyadic expr | */ int rc; WORD lhs; rdc(); reread(); rc=term(a); while (rc) { lhs = expv; switch ((int)readchar()) { case '+': term(a|1); expv += lhs; break; case '-': term(a|1); expv = lhs - expv; break; case '#': term(a|1); expv = round(lhs,expv); break; case '*': term(a|1); expv *= lhs; break; case '%': term(a|1); if(expv != 0) expv = lhs/expv; else{ if(lhs) expv = 1; else expv = 0; } break; case '&': term(a|1); expv &= lhs; break; case '|': term(a|1); expv |= lhs; break; case ')': if ((a&2)==0) error("unexpected `)'"); default: reread(); return(rc); } } return(rc); }
item(int a) { /* name [ . local ] | number | . | ^ | <register | 'x | | */ char *base; char savc; uvlong e; Symbol s; char gsym[MAXSYM], lsym[MAXSYM]; readchar(); if (isfileref()) { readfname(gsym); rdc(); /* skip white space */ if (lastc == ':') { /* it better be */ rdc(); /* skip white space */ if (!getnum(readchar)) error("bad number"); if (expv == 0) expv = 1; /* file begins at line 1 */ expv = file2pc(gsym, expv); if (expv == -1) error("%r"); return 1; } error("bad file location"); } else if (symchar(0)) { readsym(gsym); if (lastc=='.') { readchar(); /* ugh */ if (lastc == '.') { lsym[0] = '.'; readchar(); readsym(lsym+1); } else if (symchar(0)) { readsym(lsym); } else lsym[0] = 0; if (localaddr(cormap, gsym, lsym, &e, rget) < 0) error("%r"); expv = e; } else { if (lookup(0, gsym, &s) == 0) error("symbol not found"); expv = s.value; } reread(); } else if (getnum(readchar)) { ; } else if (lastc=='.') { readchar(); if (!symchar(0) && lastc != '.') { expv = dot; } else { if (findsym(rget(cormap, mach->pc), CTEXT, &s) == 0) error("no current function"); if (lastc == '.') { lsym[0] = '.'; readchar(); readsym(lsym+1); } else readsym(lsym); if (localaddr(cormap, s.name, lsym, &e, rget) < 0) error("%r"); expv = e; } reread(); } else if (lastc=='"') { expv=ditto; } else if (lastc=='+') { expv=inkdot(dotinc); } else if (lastc=='^') { expv=inkdot(-dotinc); } else if (lastc=='<') { savc=rdc(); base = regname(savc); expv = rget(cormap, base); } else if (lastc=='\'') expv = ascval(); else if (a) error("address expected"); else { reread(); return(0); } return(1); }
void main(int argc, char **argv) { int omode; volatile int quiet; char *s; char *name; quiet = 0; name = 0; outputinit(); maxoff = MAXOFF; omode = OREAD; ARGBEGIN{ default: usage(); case 'A': abort(); case 'k': kflag = 1; break; case 'w': omode = ORDWR; break; case 'I': s = ARGF(); if(s == 0) dprint("missing -I argument\n"); else Ipath = s; break; case 'm': name = ARGF(); if(name == 0) dprint("missing -m argument\n"); break; case 'q': quiet = 1; break; }ARGEND attachargs(argc, argv, omode, !quiet); dotmap = dumbmap(-1); /* * show initial state and drop into the execution loop. */ notify(fault); setsym(); if(setjmp(env) == 0){ if (pid || corhdr) setcor(); /* could get error */ if (correg && !quiet) { dprint("%s\n", mach->exc(cormap, correg)); printpc(); } } setjmp(env); if (executing) delbp(); executing = FALSE; for (;;) { flushbuf(); if (errmsg) { dprint(errmsg); printc('\n'); errmsg = 0; exitflg = 0; } if (mkfault) { mkfault=0; printc('\n'); prints(DBNAME); } clrinp(); rdc(); reread(); if (eof) { if (infile == STDIN) done(); iclose(-1, 0); eof = 0; longjmp(env, 1); } exitflg = 0; command(0, 0); reread(); if (rdc() != '\n') error("newline expected"); } }