Exemple #1
0
int main (int argc, string argv[]) {
  int a[9] = {8, 7, 6};
  printf("%d\n", findrev(2, a, sizeof(a)));
  return 0;
}
Exemple #2
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;
}