static Node* typeone(Node *t) { NodeList *init; Node *a, *b, *var; var = t->nname; init = nil; if(var == N) { typecheck(&nblank, Erv | Easgn); var = nblank; } else init = list1(nod(ODCL, var, N)); a = nod(OAS2, N, N); a->list = list(list1(var), boolname); // var,bool = b = nod(ODOTTYPE, facename, N); b->type = t->left->type; // interface.(type) a->rlist = list1(b); typecheck(&a, Etop); init = list(init, a); b = nod(OIF, N, N); b->ntest = boolname; b->nbody = list1(t->right); // if bool { goto l } a = liststmt(list(init, b)); return a; }
void dp(){ LL i; for(i=1; i<=100000; i++){ d[i] = nod(i); sig[i] = sum; } }
// n is a multi-value function call. Add t1, t2, .. = n to out // and return the list t1, t2, ... static NodeList* copyret(Node *n, NodeList **out) { Type *t; Node *tmp, *as; NodeList *l1, *l2; Iter tl; if(n->type->etype != TSTRUCT || !n->type->funarg) fatal("copyret %T %d", n->type, n->left->type->outtuple); l1 = nil; l2 = nil; for(t=structfirst(&tl, &n->type); t; t=structnext(&tl)) { tmp = temp(t->type); l1 = list(l1, tmp); l2 = list(l2, tmp); } as = nod(OAS2, N, N); as->list = l1; as->rlist = list1(n); typecheck(&as, Etop); orderstmt(as, out); return l2; }
static Node* detachexpr(Node *n, NodeList **init) { Node *addr, *as, *ind, *l; addr = nod(OADDR, n, N); l = temp(ptrto(n->type)); as = nod(OAS, l, addr); typecheck(&as, Etop); walkexpr(&as, init); *init = list(*init, as); ind = nod(OIND, l, N); typecheck(&ind, Erv); walkexpr(&ind, init); return ind; }
int getVal(int n, int i){ int sum = 0; int k; for(k = 1; k <= i; k++){ sum = sum*pow(10, nod(n*(k))) + n*k; } return sum; }
static Node* exprbsw(Case *c0, int ncase, int arg) { NodeList *cas; Node *a, *n; Case *c; int i, half, lno; cas = nil; if(ncase < Ncase) { for(i=0; i<ncase; i++) { n = c0->node; lno = setlineno(n); if(assignop(n->left->type, exprname->type, nil) == OCONVIFACE || assignop(exprname->type, n->left->type, nil) == OCONVIFACE) goto snorm; switch(arg) { case Strue: a = nod(OIF, N, N); a->ntest = n->left; // if val a->nbody = list1(n->right); // then goto l break; case Sfalse: a = nod(OIF, N, N); a->ntest = nod(ONOT, n->left, N); // if !val typecheck(&a->ntest, Erv); a->nbody = list1(n->right); // then goto l break; default: snorm: a = nod(OIF, N, N); a->ntest = nod(OEQ, exprname, n->left); // if name == val typecheck(&a->ntest, Erv); a->nbody = list1(n->right); // then goto l break; } cas = list(cas, a); c0 = c0->link; lineno = lno; } return liststmt(cas); } // find the middle and recur c = c0; half = ncase>>1; for(i=1; i<half; i++) c = c->link; a = nod(OIF, N, N); a->ntest = nod(OLE, exprname, c->node->left); typecheck(&a->ntest, Erv); a->nbody = list1(exprbsw(c0, half, arg)); a->nelse = list1(exprbsw(c->link, ncase-half, arg)); return a; }
static void litas(Node *l, Node *r, NodeList **init) { Node *a; a = nod(OAS, l, r); typecheck(&a, Etop); walkexpr(&a, init); *init = list(*init, a); }
int checkNum(int n){ int d = 0, i; int arr[10] = {0}; for( i = 1; i <= 9; i++){ arr[i] = i*n; d+=nod(arr[i]); if(d>9)return 0; if(d==9)return isPan(arr, i)?i:0; } return 0; }
static Node* uintptraddr(Node *n) { Node *r; r = nod(OADDR, n, N); r->bounded = 1; r = conv(r, types[TUNSAFEPTR]); r = conv(r, types[TUINTPTR]); return r; }
// --------------------------------------------------------------------------- // // ------------ int bXMapNetClean::join_on_nodes(bArray& loop, int* fields, bool report){ _bTrace_("bXMapNetClean::join_on_nodes",true); bGenericGeoElement *oa,*op; ivertices *vsa,*vsp; bArray bdg(sizeof(bGenericGeoElement*)); bArray nod(sizeof(bGenericGeoElement*)); bool mod; char msg[__MESSAGE_STRING_LENGTH_MAX__]; char ttl[__MESSAGE_STRING_LENGTH_MAX__]; get_localized_name(ttl,getbundle()); b_message_string(kXMapNetCleanJoinOnNodesMessage,msg,getbundle(),0); bProgressWait wt(ttl,msg,true,true,loop.count()); for(long i=1;i<=loop.count();i++){ if(!wt.set_progress(i)){ break; } loop.get(i,&oa); oa->getVertices(&vsa); mod=false; get_bridges(&vsa->vx.vx2[0],bdg); if(bdg.count()==0){ get_nodes(&vsa->vx.vx2[0],nod); if(nod.count()==1){ nod.get(1,&op); op->getVertices(&vsp); vsa->vx.vx2[0]=vsp->vx.vx2[0]; mod=true; } } get_bridges(&vsa->vx.vx2[vsa->nv-1],bdg); if(bdg.count()==0){ get_nodes(&vsa->vx.vx2[vsa->nv-1],nod); if(nod.count()==1){ nod.get(1,&op); op->getVertices(&vsp); vsa->vx.vx2[vsa->nv-1]=vsp->vx.vx2[0]; mod=true; } } if(mod){ oa->setVertices(vsa); if(report){ set_net_flag(oa,fields[oa->getType()-1],_kEdgeJoined); } } } return(0); }
static void structlit(int ctxt, int pass, Node *n, Node *var, NodeList **init) { Node *r, *a; NodeList *nl; Node *index, *value; for(nl=n->list; nl; nl=nl->next) { r = nl->n; if(r->op != OKEY) fatal("structlit: rhs not OKEY: %N", r); index = r->left; value = r->right; switch(value->op) { case OARRAYLIT: if(value->type->bound < 0) { if(pass == 1 && ctxt != 0) { a = nod(ODOT, var, newname(index->sym)); slicelit(ctxt, value, a, init); } else if(pass == 2 && ctxt == 0) { a = nod(ODOT, var, newname(index->sym)); slicelit(ctxt, value, a, init); } else if(pass == 3) break; continue; } a = nod(ODOT, var, newname(index->sym)); arraylit(ctxt, pass, value, a, init); continue; case OSTRUCTLIT: a = nod(ODOT, var, newname(index->sym)); structlit(ctxt, pass, value, a, init); continue; } if(isliteral(value)) { if(pass == 2) continue; } else if(pass == 1) continue; // build list of var.field = expr a = nod(ODOT, var, newname(index->sym)); a = nod(OAS, a, value); typecheck(&a, Etop); walkexpr(&a, init); if(pass == 1) { if(a->op != OAS) fatal("structlit: not as"); a->dodata = 2; } *init = list(*init, a); } }
int main(void){ int t; scanf("%d", &t); FORS(i, 0, 1, MAX) memonod[i] = memosod[i] = -1; for(int a, b, k; t-- && scanf("%d %d %d", &a, &b, &k) == 3; ){ int start = ((a + k - 1) / k) * k; long long int g = 0, h = 0; ++b; FORS(i, start, k, b){ g += nod(i); h += sod(i); } printf("%lld %lld\n", g, h); }
static void arraylit(int ctxt, int pass, Node *n, Node *var, NodeList **init) { Node *r, *a; NodeList *l; Node *index, *value; for(l=n->list; l; l=l->next) { r = l->n; if(r->op != OKEY) fatal("arraylit: rhs not OKEY: %N", r); index = r->left; value = r->right; switch(value->op) { case OARRAYLIT: if(value->type->bound < 0) { if(pass == 1 && ctxt != 0) { a = nod(OINDEX, var, index); slicelit(ctxt, value, a, init); } else if(pass == 2 && ctxt == 0) { a = nod(OINDEX, var, index); slicelit(ctxt, value, a, init); } else if(pass == 3) break; continue; } a = nod(OINDEX, var, index); arraylit(ctxt, pass, value, a, init); continue; case OSTRUCTLIT: a = nod(OINDEX, var, index); structlit(ctxt, pass, value, a, init); continue; } if(isliteral(index) && isliteral(value)) { if(pass == 2) continue; } else if(pass == 1) continue; // build list of var[index] = value a = nod(OINDEX, var, index); a = nod(OAS, a, value); typecheck(&a, Etop); walkexpr(&a, init); // add any assignments in r to top if(pass == 1) { if(a->op != OAS) fatal("structlit: not as"); a->dodata = 2; } *init = list(*init, a); } }
static Node* typebsw(Case *c0, int ncase) { NodeList *cas; Node *a, *n; Case *c; int i, half; cas = nil; if(ncase < Ncase) { for(i=0; i<ncase; i++) { n = c0->node; if(c0->type != Ttypeconst) fatal("typebsw"); a = nod(OIF, N, N); a->ntest = nod(OEQ, hashname, nodintconst(c0->hash)); typecheck(&a->ntest, Erv); a->nbody = list1(n->right); cas = list(cas, a); c0 = c0->link; } return liststmt(cas); } // find the middle and recur c = c0; half = ncase>>1; for(i=1; i<half; i++) c = c->link; a = nod(OIF, N, N); a->ntest = nod(OLE, hashname, nodintconst(c->hash)); typecheck(&a->ntest, Erv); a->nbody = list1(typebsw(c0, half)); a->nelse = list1(typebsw(c->link, ncase-half)); return a; }
void update1D(int level, int node, int ini, int fin, long long val, bool leaf){ if(ini > c2 || fin < c1)return; if(ini >= c1 && fin <= c2){ if(leaf)tree2D[level][node] = nod(val, val); else tree2D[level][node] = tree2D[2 * level][node] + tree2D[2 * level + 1][node]; return; } update1D(level, v1, ini, me, val, leaf); update1D(level, v2, me + 1, fin, val, leaf); tree2D[level][node] = tree2D[level][v1] + tree2D[level][v2]; }
Node* typebsw(Case *c0, int ncase) { NodeList *cas; Node *a, *n; Case *c; int i, half; Val v; cas = nil; if(ncase < Ncase) { for(i=0; i<ncase; i++) { n = c0->node; switch(c0->type) { case Ttypenil: v.ctype = CTNIL; a = nod(OIF, N, N); a->ntest = nod(OEQ, facename, nodlit(v)); typecheck(&a->ntest, Erv); a->nbody = list1(n->right); // if i==nil { goto l } cas = list(cas, a); break; case Ttypevar: a = typeone(n); cas = list(cas, a); break; case Ttypeconst: a = nod(OIF, N, N); a->ntest = nod(OEQ, hashname, nodintconst(c0->hash)); typecheck(&a->ntest, Erv); a->nbody = list1(typeone(n)); cas = list(cas, a); break; } c0 = c0->link; } return liststmt(cas); } // find the middle and recur c = c0; half = ncase>>1; for(i=1; i<half; i++) c = c->link; a = nod(OIF, N, N); a->ntest = nod(OLE, hashname, nodintconst(c->hash)); typecheck(&a->ntest, Erv); a->nbody = list1(typebsw(c0, half)); a->nelse = list1(typebsw(c->link, ncase-half)); return a; }
status_t ThemeManager::DeleteTheme(int32 id) { status_t err; BMessage *theme; BString loc; if ((id < 0) || (id >= fThemeList.CountItems())) return EINVAL; theme = (BMessage *)fThemeList.RemoveItem(id); fThemeList.AddItem(NULL, id); /* keep the place occupied */ if (!theme) return -1; err = theme->FindString(Z_THEME_LOCATION, &loc); if (!err) { // move the files to trash... BEntry ent(loc.String()); if (ent.InitCheck() == B_OK) { BPath trash; err = find_directory(B_TRASH_DIRECTORY, &trash); if (!err) { BDirectory trashDir(trash.Path()); if (trashDir.InitCheck() == B_OK) { BNode nod(&ent); if (nod.InitCheck() == B_OK) { BPath path; err = ent.GetPath(&path); if (!err) { nod.WriteAttr("_trk/original_path", B_STRING_TYPE, 0LL, path.Path(), strlen(path.Path())+1); } } err = ent.MoveTo(&trashDir, NULL); // don't clober if (err) { BString newname("Theme-renamed-"); newname << system_time(); err = ent.MoveTo(&trashDir, newname.String(), true); } } } } } if (id == fSelectedTheme) fSelectedTheme = -1; delete theme; return B_OK; }
void generate() { int i=1, j=2, n; ans[1] = 1; num[1] = 1; for(i=2; ; i++) { n = num[i-1] + nod(num[i-1]); if(n>=1000000) n = 1000000; for(; j<=n; j++) ans[j] = ans[j-1]; if(n == 1000000)break; ans[n] = ans[n-1] + 1; num[i] = n; } }
// --------------------------------------------------------------------------- // // ------------ int bXMapNetClean::check_nodes(bArray& loop, int* fields){ _bTrace_("bXMapNetClean::check_nodes",true); bGenericGeoElement *oa; ivertices *vsa; bArray edg(sizeof(bGenericGeoElement*)); bArray nod(sizeof(bGenericGeoElement*)); double dbk=_cfg_prm.dnod; char msg[__MESSAGE_STRING_LENGTH_MAX__]; char ttl[__MESSAGE_STRING_LENGTH_MAX__]; _cfg_prm.dnod=0; get_localized_name(ttl,getbundle()); b_message_string(kXMapNetCleanCheckNodesMessage,msg,getbundle(),0); bProgressWait wt(ttl,msg,true,true,loop.count()); for(long i=1;i<=loop.count();i++){ if(!wt.set_progress(i)){ break; } loop.get(i,&oa); oa->getVertices(&vsa); get_nodes(&vsa->vx.vx2[0],nod); if(nod.count()>1){ set_net_flag(oa,fields[oa->getType()-1],_kNodeDoubled); } get_edges(&vsa->vx.vx2[0],nod,true); if(edg.count()==0){ set_net_flag(oa,fields[oa->getType()-1],_kNodeAlone); set_net_flag(oa,fields[oa->getType()-1],_kNodeNot3); } else if(edg.count()==1){ set_net_flag(oa,fields[oa->getType()-1],_kNodeDeadEnd); set_net_flag(oa,fields[oa->getType()-1],_kNodeNot3); } else if(edg.count()==2){ set_net_flag(oa,fields[oa->getType()-1],_kNodeNot3); } } _cfg_prm.dnod=dbk; return(0); }
// appendinit is like addinit in subr.c // but appends rather than prepends. static void appendinit(Node **np, NodeList *init) { Node *n; if(init == nil) return; n = *np; switch(n->op) { case ONAME: case OLITERAL: // There may be multiple refs to this node; // introduce OCONVNOP to hold init list. n = nod(OCONVNOP, n, N); n->type = n->left->type; n->typecheck = 1; *np = n; break; } n->ninit = concat(n->ninit, init); n->ullman = UINF; }
void racewalk(Node *fn) { Node *nd; Node *nodpc; char s[1024]; if(ispkgin(omit_pkgs, nelem(omit_pkgs)) || isforkfunc(fn)) return; if(!ispkgin(noinst_pkgs, nelem(noinst_pkgs))) { racewalklist(fn->nbody, nil); // nothing interesting for race detector in fn->enter racewalklist(fn->exit, nil); } // nodpc is the PC of the caller as extracted by // getcallerpc. We use -widthptr(FP) for x86. // BUG: this will not work on arm. nodpc = nod(OXXX, nil, nil); *nodpc = *nodfp; nodpc->type = types[TUINTPTR]; nodpc->xoffset = -widthptr; nd = mkcall("racefuncenter", T, nil, nodpc); fn->enter = concat(list1(nd), fn->enter); nd = mkcall("racefuncexit", T, nil); fn->exit = list(fn->exit, nd); if(debug['W']) { snprint(s, sizeof(s), "after racewalk %S", fn->nname->sym); dumplist(s, fn->nbody); snprint(s, sizeof(s), "enter %S", fn->nname->sym); dumplist(s, fn->enter); snprint(s, sizeof(s), "exit %S", fn->nname->sym); dumplist(s, fn->exit); } }
/* * convert switch of the form * switch v := i.(type) { case t1: ..; case t2: ..; } * into if statements */ static void typeswitch(Node *sw) { Node *def; NodeList *cas, *hash; Node *a, *n; Case *c, *c0, *c1; int ncase; Type *t; Val v; if(sw->ntest == nil) return; if(sw->ntest->right == nil) { setlineno(sw); yyerror("type switch must have an assignment"); return; } walkexpr(&sw->ntest->right, &sw->ninit); if(!istype(sw->ntest->right->type, TINTER)) { yyerror("type switch must be on an interface"); return; } cas = nil; /* * predeclare temporary variables * and the boolean var */ facename = temp(sw->ntest->right->type); a = nod(OAS, facename, sw->ntest->right); typecheck(&a, Etop); cas = list(cas, a); casebody(sw, facename); boolname = temp(types[TBOOL]); typecheck(&boolname, Erv); hashname = temp(types[TUINT32]); typecheck(&hashname, Erv); t = sw->ntest->right->type; if(isnilinter(t)) a = syslook("efacethash", 1); else a = syslook("ifacethash", 1); argtype(a, t); a = nod(OCALL, a, N); a->list = list1(facename); a = nod(OAS, hashname, a); typecheck(&a, Etop); cas = list(cas, a); c0 = mkcaselist(sw, Stype); if(c0 != C && c0->type == Tdefault) { def = c0->node->right; c0 = c0->link; } else { def = nod(OBREAK, N, N); } /* * insert if statement into each case block */ for(c=c0; c!=C; c=c->link) { n = c->node; switch(c->type) { case Ttypenil: v.ctype = CTNIL; a = nod(OIF, N, N); a->ntest = nod(OEQ, facename, nodlit(v)); typecheck(&a->ntest, Erv); a->nbody = list1(n->right); // if i==nil { goto l } n->right = a; break; case Ttypevar: case Ttypeconst: n->right = typeone(n); break; } } /* * generate list of if statements, binary search for constant sequences */ while(c0 != C) { if(c0->type != Ttypeconst) { n = c0->node; cas = list(cas, n->right); c0=c0->link; continue; } // identify run of constants c1 = c = c0; while(c->link!=C && c->link->type==Ttypeconst) c = c->link; c0 = c->link; c->link = nil; // sort by hash c1 = csort(c1, typecmp); // for debugging: linear search if(0) { for(c=c1; c!=C; c=c->link) { n = c->node; cas = list(cas, n->right); } continue; } // combine adjacent cases with the same hash ncase = 0; for(c=c1; c!=C; c=c->link) { ncase++; hash = list1(c->node->right); while(c->link != C && c->link->hash == c->hash) { hash = list(hash, c->link->node->right); c->link = c->link->link; } c->node->right = liststmt(hash); } // binary search among cases to narrow by hash cas = list(cas, typebsw(c1, ncase)); } if(nerrors == 0) { cas = list(cas, def); sw->nbody = concat(cas, sw->nbody); sw->list = nil; walkstmtlist(sw->nbody); } }
/* * normal (expression) switch. * rebulid case statements into if .. goto */ static void exprswitch(Node *sw) { Node *def; NodeList *cas; Node *a; Case *c0, *c, *c1; Type *t; int arg, ncase; casebody(sw, N); arg = Snorm; if(isconst(sw->ntest, CTBOOL)) { arg = Strue; if(sw->ntest->val.u.bval == 0) arg = Sfalse; } walkexpr(&sw->ntest, &sw->ninit); t = sw->type; if(t == T) return; /* * convert the switch into OIF statements */ exprname = N; cas = nil; if(arg != Strue && arg != Sfalse) { exprname = temp(sw->ntest->type); cas = list1(nod(OAS, exprname, sw->ntest)); typechecklist(cas, Etop); } else { exprname = nodbool(arg == Strue); } c0 = mkcaselist(sw, arg); if(c0 != C && c0->type == Tdefault) { def = c0->node->right; c0 = c0->link; } else { def = nod(OBREAK, N, N); } loop: if(c0 == C) { cas = list(cas, def); sw->nbody = concat(cas, sw->nbody); sw->list = nil; walkstmtlist(sw->nbody); return; } // deal with the variables one-at-a-time if(!okforcmp[t->etype] || c0->type != Texprconst) { a = exprbsw(c0, 1, arg); cas = list(cas, a); c0 = c0->link; goto loop; } // do binary search on run of constants ncase = 1; for(c=c0; c->link!=C; c=c->link) { if(c->link->type != Texprconst) break; ncase++; } // break the chain at the count c1 = c->link; c->link = C; // sort and compile constants c0 = csort(c0, exprcmp); a = exprbsw(c0, ncase, arg); cas = list(cas, a); c0 = c1; goto loop; }
/* * build separate list of statements and cases * make labels between cases and statements * deal with fallthrough, break, unreachable statements */ static void casebody(Node *sw, Node *typeswvar) { Node *n, *c, *last; Node *def; NodeList *cas, *stat, *l, *lc; Node *go, *br; int32 lno, needvar; if(sw->list == nil) return; lno = setlineno(sw); cas = nil; // cases stat = nil; // statements def = N; // defaults br = nod(OBREAK, N, N); for(l=sw->list; l; l=l->next) { n = l->n; setlineno(n); if(n->op != OXCASE) fatal("casebody %O", n->op); n->op = OCASE; needvar = count(n->list) != 1 || n->list->n->op == OLITERAL; go = nod(OGOTO, newlabel(), N); if(n->list == nil) { if(def != N) yyerror("more than one default case"); // reuse original default case n->right = go; def = n; } if(n->list != nil && n->list->next == nil) { // one case - reuse OCASE node. c = n->list->n; n->left = c; n->right = go; n->list = nil; cas = list(cas, n); } else { // expand multi-valued cases for(lc=n->list; lc; lc=lc->next) { c = lc->n; cas = list(cas, nod(OCASE, c, go)); } } stat = list(stat, nod(OLABEL, go->left, N)); if(typeswvar && needvar && n->nname != N) { NodeList *l; l = list1(nod(ODCL, n->nname, N)); l = list(l, nod(OAS, n->nname, typeswvar)); typechecklist(l, Etop); stat = concat(stat, l); } stat = concat(stat, n->nbody); // botch - shouldn't fall thru declaration last = stat->end->n; if(last->xoffset == n->xoffset && last->op == OXFALL) { if(typeswvar) { setlineno(last); yyerror("cannot fallthrough in type switch"); } if(l->next == nil) { setlineno(last); yyerror("cannot fallthrough final case in switch"); } last->op = OFALL; } else stat = list(stat, br); } stat = list(stat, br); if(def) cas = list(cas, def); sw->list = cas; sw->nbody = stat; lineno = lno; }
/* * convert switch of the form * switch v := i.(type) { case t1: ..; case t2: ..; } * into if statements */ void typeswitch(Node *sw) { Node *def; NodeList *cas; Node *a; Case *c, *c0, *c1; int ncase; Type *t; if(sw->ntest == nil) return; if(sw->ntest->right == nil) { setlineno(sw); yyerror("type switch must have an assignment"); return; } walkexpr(&sw->ntest->right, &sw->ninit); if(!istype(sw->ntest->right->type, TINTER)) { yyerror("type switch must be on an interface"); return; } cas = nil; /* * predeclare temporary variables * and the boolean var */ facename = nod(OXXX, N, N); tempname(facename, sw->ntest->right->type); a = nod(OAS, facename, sw->ntest->right); typecheck(&a, Etop); cas = list(cas, a); casebody(sw, facename); boolname = nod(OXXX, N, N); tempname(boolname, types[TBOOL]); typecheck(&boolname, Erv); hashname = nod(OXXX, N, N); tempname(hashname, types[TUINT32]); typecheck(&hashname, Erv); t = sw->ntest->right->type; if(isnilinter(t)) a = syslook("efacethash", 1); else a = syslook("ifacethash", 1); argtype(a, t); a = nod(OCALL, a, N); a->list = list1(facename); a = nod(OAS, hashname, a); typecheck(&a, Etop); cas = list(cas, a); c0 = mkcaselist(sw, Stype); if(c0 != C && c0->type == Tdefault) { def = c0->node->right; c0 = c0->link; } else { def = nod(OBREAK, N, N); } loop: if(c0 == C) { cas = list(cas, def); sw->nbody = concat(cas, sw->nbody); sw->list = nil; walkstmtlist(sw->nbody); return; } // deal with the variables one-at-a-time if(c0->type != Ttypeconst) { a = typebsw(c0, 1); cas = list(cas, a); c0 = c0->link; goto loop; } // do binary search on run of constants ncase = 1; for(c=c0; c->link!=C; c=c->link) { if(c->link->type != Ttypeconst) break; ncase++; } // break the chain at the count c1 = c->link; c->link = C; // sort and compile constants c0 = csort(c0, typecmp); a = typebsw(c0, ncase); cas = list(cas, a); c0 = c1; goto loop; }
static void slicelit(int ctxt, Node *n, Node *var, NodeList **init) { Node *r, *a; NodeList *l; Type *t; Node *vstat, *vauto; Node *index, *value; int mode; // make an array type t = shallow(n->type); t->bound = mpgetfix(n->right->val.u.xval); t->width = 0; t->sym = nil; dowidth(t); if(ctxt != 0) { // put everything into static array vstat = staticname(t, ctxt); arraylit(ctxt, 1, n, vstat, init); arraylit(ctxt, 2, n, vstat, init); // copy static to slice a = nod(OSLICE, vstat, nod(OKEY, N, N)); a = nod(OAS, var, a); typecheck(&a, Etop); a->dodata = 2; *init = list(*init, a); return; } // recipe for var = []t{...} // 1. make a static array // var vstat [...]t // 2. assign (data statements) the constant part // vstat = constpart{} // 3. make an auto pointer to array and allocate heap to it // var vauto *[...]t = new([...]t) // 4. copy the static array to the auto array // *vauto = vstat // 5. assign slice of allocated heap to var // var = [0:]*auto // 6. for each dynamic part assign to the slice // var[i] = dynamic part // // an optimization is done if there is no constant part // 3. var vauto *[...]t = new([...]t) // 5. var = [0:]*auto // 6. var[i] = dynamic part // if the literal contains constants, // make static initialized array (1),(2) vstat = N; mode = getdyn(n, 1); if(mode & MODECONST) { vstat = staticname(t, ctxt); arraylit(ctxt, 1, n, vstat, init); } // make new auto *array (3 declare) vauto = nod(OXXX, N, N); tempname(vauto, ptrto(t)); // set auto to point at new heap (3 assign) a = nod(ONEW, N, N); a->list = list1(typenod(t)); a = nod(OAS, vauto, a); typecheck(&a, Etop); walkexpr(&a, init); *init = list(*init, a); if(vstat != N) { // copy static to heap (4) a = nod(OIND, vauto, N); a = nod(OAS, a, vstat); typecheck(&a, Etop); walkexpr(&a, init); *init = list(*init, a); } // make slice out of heap (5) a = nod(OAS, var, nod(OSLICE, vauto, nod(OKEY, N, N))); typecheck(&a, Etop); walkexpr(&a, init); *init = list(*init, a); // put dynamics into slice (6) for(l=n->list; l; l=l->next) { r = l->n; if(r->op != OKEY) fatal("slicelit: rhs not OKEY: %N", r); index = r->left; value = r->right; a = nod(OINDEX, var, index); a->etype = 1; // no bounds checking // TODO need to check bounds? switch(value->op) { case OARRAYLIT: if(value->type->bound < 0) break; arraylit(ctxt, 2, value, a, init); continue; case OSTRUCTLIT: structlit(ctxt, 2, value, a, init); continue; } if(isliteral(index) && isliteral(value)) continue; // build list of var[c] = expr a = nod(OAS, a, value); typecheck(&a, Etop); walkexpr(&a, init); *init = list(*init, a); } }
Answer add(char* num1,char* num2) { Answer res; res.flag=1; int i,j,d; int size1,size2,size; if(isValid(num1,num2)) { // Copy the Binary Number into an Array int* arr1=(int*)malloc(nod(num1)*sizeof(int)); int* arr2=(int*)malloc(nod(num2)*sizeof(int)); char *ans; for(i=0,j=0;num1[i]!='\0';i++) { if(num1[i]=='1'||num1[i]=='0') arr1[j++]=(int)num1[i]-48; } size1=j; for(i=0,j=0;num2[i]!='\0';i++) { if(num2[i]=='1'||num2[i]=='0') arr2[j++]=(int)num2[i]-48; } size2=j; d=0; if(size1>size2) size=size1; else size=size2; size1--,size2--; ans=(char*)malloc((size+2)*sizeof(char)); i=0; //Start Calculating the Sum of Binary Numbers from the One's Place of Binary Numbers while(size1>=0&&size2>=0) { d=arr1[size1--]+arr2[size2--]+d; ans[i++]=(char)(d%2+48); d/=2; } while(size1>=0) // If Second Binary Number has been Added, Computation of Carry and First Binary Number { d=arr1[size1--]+d; ans[i++]=(char)(d%2+48); d/=2; } while(size2>=0) // If First Binary Number has been Added, Computation of Carry and Second Binary Number { d=arr2[size2--]+d; ans[i++]=(char)(d%2+48); d/=2; } ans[i++]=(char)(d+48); // Inserting the Carry into the Answer String ans[i]='\0'; i=0; j=size; while(i<j) // Reversing the String { char c=ans[i]; ans[i]=ans[j]; ans[j]=c; i++,j--; } res.c=ans; } else { //printf("Invalid Input Format \n"); res.c=NULL; res.flag=0; // FLag for Invalid Input Format } return res; }
void walkrange(Node *n) { Node *ohv1, *hv1, *hv2; // hidden (old) val 1, 2 Node *ha, *hit; // hidden aggregate, iterator Node *hn, *hp; // hidden len, pointer Node *hb; // hidden bool Node *a, *v1, *v2; // not hidden aggregate, val 1, 2 Node *fn, *tmp; NodeList *body, *init; Type *th, *t; int lno; t = n->type; init = nil; a = n->right; lno = setlineno(a); if(t->etype == TSTRING && !eqtype(t, types[TSTRING])) { a = nod(OCONV, n->right, N); a->type = types[TSTRING]; } v1 = n->list->n; v2 = N; if(n->list->next) v2 = n->list->next->n; hv2 = N; if(v2 == N && t->etype == TARRAY) { // will have just one reference to argument. // no need to make a potentially expensive copy. ha = a; } else { ha = temp(a->type); init = list(init, nod(OAS, ha, a)); } switch(t->etype) { default: fatal("walkrange"); case TARRAY: hv1 = temp(types[TINT]); hn = temp(types[TINT]); hp = nil; init = list(init, nod(OAS, hv1, N)); init = list(init, nod(OAS, hn, nod(OLEN, ha, N))); if(v2) { hp = temp(ptrto(n->type->type)); tmp = nod(OINDEX, ha, nodintconst(0)); tmp->etype = 1; // no bounds check init = list(init, nod(OAS, hp, nod(OADDR, tmp, N))); } n->ntest = nod(OLT, hv1, hn); n->nincr = nod(OASOP, hv1, nodintconst(1)); n->nincr->etype = OADD; if(v2 == N) body = list1(nod(OAS, v1, hv1)); else { a = nod(OAS2, N, N); a->list = list(list1(v1), v2); a->rlist = list(list1(hv1), nod(OIND, hp, N)); body = list1(a); tmp = nod(OADD, hp, nodintconst(t->type->width)); tmp->type = hp->type; tmp->typecheck = 1; tmp->right->type = types[tptr]; tmp->right->typecheck = 1; body = list(body, nod(OAS, hp, tmp)); } break; case TMAP: th = typ(TARRAY); th->type = ptrto(types[TUINT8]); // see ../../pkg/runtime/hashmap.h:/hash_iter // Size in words. th->bound = 5 + 4*3 + 4*4/widthptr; hit = temp(th); fn = syslook("mapiterinit", 1); argtype(fn, t->down); argtype(fn, t->type); argtype(fn, th); init = list(init, mkcall1(fn, T, nil, typename(t), ha, nod(OADDR, hit, N))); n->ntest = nod(ONE, nod(OINDEX, hit, nodintconst(0)), nodnil()); fn = syslook("mapiternext", 1); argtype(fn, th); n->nincr = mkcall1(fn, T, nil, nod(OADDR, hit, N)); if(v2 == N) { fn = syslook("mapiter1", 1); argtype(fn, th); argtype(fn, t->down); a = nod(OAS, v1, mkcall1(fn, t->down, nil, nod(OADDR, hit, N))); } else { fn = syslook("mapiter2", 1); argtype(fn, th); argtype(fn, t->down); argtype(fn, t->type); a = nod(OAS2, N, N); a->list = list(list1(v1), v2); a->rlist = list1(mkcall1(fn, getoutargx(fn->type), nil, nod(OADDR, hit, N))); } body = list1(a); break; case TCHAN: hv1 = temp(t->type); hb = temp(types[TBOOL]); n->ntest = nod(ONE, hb, nodbool(0)); a = nod(OAS2RECV, N, N); a->typecheck = 1; a->list = list(list1(hv1), hb); a->rlist = list1(nod(ORECV, ha, N)); n->ntest->ninit = list1(a); body = list1(nod(OAS, v1, hv1)); break; case TSTRING: ohv1 = temp(types[TINT]); hv1 = temp(types[TINT]); init = list(init, nod(OAS, hv1, N)); if(v2 == N) a = nod(OAS, hv1, mkcall("stringiter", types[TINT], nil, ha, hv1)); else { hv2 = temp(runetype); a = nod(OAS2, N, N); a->list = list(list1(hv1), hv2); fn = syslook("stringiter2", 0); a->rlist = list1(mkcall1(fn, getoutargx(fn->type), nil, ha, hv1)); } n->ntest = nod(ONE, hv1, nodintconst(0)); n->ntest->ninit = list(list1(nod(OAS, ohv1, hv1)), a); body = list1(nod(OAS, v1, ohv1)); if(v2 != N) body = list(body, nod(OAS, v2, hv2)); break; } n->op = OFOR; typechecklist(init, Etop); n->ninit = concat(n->ninit, init); typechecklist(n->ntest->ninit, Etop); typecheck(&n->ntest, Erv); typecheck(&n->nincr, Etop); typechecklist(body, Etop); n->nbody = concat(body, n->nbody); walkstmt(&n); lineno = lno; }
void anylit(int ctxt, Node *n, Node *var, NodeList **init) { Type *t; Node *a, *vstat; t = n->type; switch(n->op) { default: fatal("anylit: not lit"); case OSTRUCTLIT: if(t->etype != TSTRUCT) fatal("anylit: not struct"); if(simplename(var)) { if(ctxt == 0) { // lay out static data vstat = staticname(t, ctxt); structlit(ctxt, 1, n, vstat, init); // copy static to var a = nod(OAS, var, vstat); typecheck(&a, Etop); walkexpr(&a, init); *init = list(*init, a); // add expressions to automatic structlit(ctxt, 2, n, var, init); break; } structlit(ctxt, 1, n, var, init); structlit(ctxt, 2, n, var, init); break; } // initialize of not completely specified if(count(n->list) < structcount(t)) { a = nod(OAS, var, N); typecheck(&a, Etop); walkexpr(&a, init); *init = list(*init, a); } structlit(ctxt, 3, n, var, init); break; case OARRAYLIT: if(t->etype != TARRAY) fatal("anylit: not array"); if(t->bound < 0) { slicelit(ctxt, n, var, init); break; } if(simplename(var)) { if(ctxt == 0) { // lay out static data vstat = staticname(t, ctxt); arraylit(1, 1, n, vstat, init); // copy static to automatic a = nod(OAS, var, vstat); typecheck(&a, Etop); walkexpr(&a, init); *init = list(*init, a); // add expressions to automatic arraylit(ctxt, 2, n, var, init); break; } arraylit(ctxt, 1, n, var, init); arraylit(ctxt, 2, n, var, init); break; } // initialize of not completely specified if(count(n->list) < t->bound) { a = nod(OAS, var, N); typecheck(&a, Etop); walkexpr(&a, init); *init = list(*init, a); } arraylit(ctxt, 3, n, var, init); break; case OMAPLIT: if(t->etype != TMAP) fatal("anylit: not map"); maplit(ctxt, n, var, init); break; } }
static void maplit(int ctxt, Node *n, Node *var, NodeList **init) { Node *r, *a; NodeList *l; int nerr, b; Type *t, *tk, *tv, *t1; Node *vstat, *index, *value; Sym *syma, *symb; ctxt = 0; // make the map var nerr = nerrors; a = nod(OMAKE, N, N); a->list = list1(typenod(n->type)); litas(var, a, init); // count the initializers b = 0; for(l=n->list; l; l=l->next) { r = l->n; if(r->op != OKEY) fatal("slicelit: rhs not OKEY: %N", r); index = r->left; value = r->right; if(isliteral(index) && isliteral(value)) b++; } t = T; if(b != 0) { // build type [count]struct { a Tindex, b Tvalue } t = n->type; tk = t->down; tv = t->type; symb = lookup("b"); t = typ(TFIELD); t->type = tv; t->sym = symb; syma = lookup("a"); t1 = t; t = typ(TFIELD); t->type = tk; t->sym = syma; t->down = t1; t1 = t; t = typ(TSTRUCT); t->type = t1; t1 = t; t = typ(TARRAY); t->bound = b; t->type = t1; dowidth(t); // make and initialize static array vstat = staticname(t, ctxt); b = 0; for(l=n->list; l; l=l->next) { r = l->n; if(r->op != OKEY) fatal("slicelit: rhs not OKEY: %N", r); index = r->left; value = r->right; if(isliteral(index) && isliteral(value)) { // build vstat[b].a = key; a = nodintconst(b); a = nod(OINDEX, vstat, a); a = nod(ODOT, a, newname(syma)); a = nod(OAS, a, index); typecheck(&a, Etop); walkexpr(&a, init); a->dodata = 2; *init = list(*init, a); // build vstat[b].b = value; a = nodintconst(b); a = nod(OINDEX, vstat, a); a = nod(ODOT, a, newname(symb)); a = nod(OAS, a, value); typecheck(&a, Etop); walkexpr(&a, init); a->dodata = 2; *init = list(*init, a); b++; } } // loop adding structure elements to map // for i = 0; i < len(vstat); i++ { // map[vstat[i].a] = vstat[i].b // } index = nod(OXXX, N, N); tempname(index, types[TINT]); a = nod(OINDEX, vstat, index); a->etype = 1; // no bounds checking a = nod(ODOT, a, newname(symb)); r = nod(OINDEX, vstat, index); r->etype = 1; // no bounds checking r = nod(ODOT, r, newname(syma)); r = nod(OINDEX, var, r); r = nod(OAS, r, a); a = nod(OFOR, N, N); a->nbody = list1(r); a->ninit = list1(nod(OAS, index, nodintconst(0))); a->ntest = nod(OLT, index, nodintconst(t->bound)); a->nincr = nod(OASOP, index, nodintconst(1)); a->nincr->etype = OADD; typecheck(&a, Etop); walkstmt(&a); *init = list(*init, a); } // put in dynamic entries one-at-a-time for(l=n->list; l; l=l->next) { r = l->n; if(r->op != OKEY) fatal("slicelit: rhs not OKEY: %N", r); index = r->left; value = r->right; if(isliteral(index) && isliteral(value)) continue; // build list of var[c] = expr a = nod(OINDEX, var, r->left); a = nod(OAS, a, r->right); typecheck(&a, Etop); walkexpr(&a, init); if(nerr != nerrors) break; *init = list(*init, a); } }