int main (int argc, string argv[]) { int a[9] = {8, 7, 6}; printf("%d\n", findrev(2, a, sizeof(a))); return 0; }
static char* fswalk1(Fid *fid, char *name, Qid *qid) { Revtree* (*loadfn)(Revlog *, Revlog *, Revinfo *); char buf[MAXPATH], *sname; Revnode *nd; Revfile *rf; int i, level; if((fid->qid.type & QTDIR) == 0) return "walk in non-directory"; rf = fid->aux; if(strcmp(name, "..") == 0){ switch(rf->level){ case Qroot: break; case Qrev: rf->info = nil; rf->level = Qroot; break; case Qfiles: case Qchanges: closerevtree(rf->tree); rf->tree = nil; rf->level = Qrev; break; case Qtree: closerevlog(rf->rlog); rf->rlog = nil; if((rf->node = rf->node->up) == rf->tree->root) rf->level = rf->tree->level; break; } } else { switch(rf->level){ case Qroot: revlogupdate(&changelog); revlogupdate(&manifest); i = findrev(&changelog, name); if(rf->info = getrevinfo(i)){ rf->level = Qrev; break; } Notfound: return "directory entry not found"; break; case Qrev: for(i = Qrev+1; i < Qtree; i++){ if(nametab[i] == nil) continue; if(strcmp(name, nametab[i]) == 0) break; } loadfn = nil; switch(i){ case Qtree: goto Notfound; case Qfiles: loadfn = loadfilestree; break; case Qchanges: loadfn = loadchangestree; break; } if(loadfn){ if((rf->tree = getrevtree(loadfn, rf->info)) == nil) goto Notfound; rf->node = rf->tree->root; rf->tree->level = i; } rf->level = i; break; case Qtree: case Qfiles: case Qchanges: i = 0; level = Qtree; sname = name; Searchtree: for(nd = rf->node->down; nd; nd = nd->next) if(strcmp(nd->name, sname) == 0) break; if(nd == nil){ if(sname == name){ sname = strrchr(name, '.'); if((i = sname - name) > 0){ sname++; if(strncmp(sname, "rev", 3) == 0){ level = Qtreerev; sname += 3; } snprint(buf, sizeof(buf), "%.*s", i, name); if(*sname == 0) i = 0; else { i = strtol(sname, &sname, 10); if(i < 0 || *sname != '\0') goto Notfound; } sname = buf; goto Searchtree; } } goto Notfound; } if(nd->hash){ Revnode *nb; int j; if((rf->rlog = getrevlog(nd)) == nil) goto Notfound; j = hashrev(rf->rlog, nd->hash) - i; if(i < 0 || j < 0 || j >= rf->rlog->nmap){ closerevlog(rf->rlog); rf->rlog = nil; goto Notfound; } for(nb = nd; nb; nb = nb->before) if(hashrev(rf->rlog, nb->hash) == j) break; if(nb == nil){ nb = mknode(nd->name, revhash(rf->rlog, j), nd->mode); nb->up = nd->up; nb->before = nd->before; nd->before = nb; } nd = nb; } else if(name != sname) goto Notfound; rf->node = nd; rf->level = level; break; } } if(rf->level < Qtree) fsmkqid(qid, rf->level, rf->info); else fsmkqid(qid, rf->level, rf->node); fid->qid = *qid; return nil; }