diff options
| author | Ondřej Surý <ondrej@sury.org> | 2011-02-18 09:50:58 +0100 | 
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2011-02-18 09:50:58 +0100 | 
| commit | c072558b90f1bbedc2022b0f30c8b1ac4712538e (patch) | |
| tree | 67767591619e4bd8111fb05fac185cde94fb7378 /src/libmach/obj.c | |
| parent | 5859517b767c99749a45651c15d4bae5520ebae8 (diff) | |
| download | golang-c072558b90f1bbedc2022b0f30c8b1ac4712538e.tar.gz | |
Imported Upstream version 2011.02.15upstream/2011.02.15
Diffstat (limited to 'src/libmach/obj.c')
| -rw-r--r-- | src/libmach/obj.c | 46 | 
1 files changed, 24 insertions, 22 deletions
| diff --git a/src/libmach/obj.c b/src/libmach/obj.c index dacb2ae1f..1ffe7a0ee 100644 --- a/src/libmach/obj.c +++ b/src/libmach/obj.c @@ -116,34 +116,24 @@ objtype(Biobuf *bp, char **name)  	int i;  	char buf[MAXIS];  	int c; - -Retry: -	if(Bread(bp, buf, MAXIS) < MAXIS) -		return -1; -	Bseek(bp, -MAXIS, 1); -	for (i = 0; i < Maxobjtype; i++) { -		if (obj[i].is && (*obj[i].is)(buf)) { -			if (name) -				*name = obj[i].name; -			return i; -		} -	} +	char *p;  	/* -	 * Maybe there's an import block we need to skip +	 * Look for import block.  	 */ -	for(i = 0; i < MAXIS; i++) { -		if(isalpha(buf[i]) || isdigit(buf[i])) -			continue; -		if(i == 0 || buf[i] != '\n') -			return -1; -		break; -	} +	p = Brdline(bp, '\n'); +	if(p == nil) +		return -1; +	if(Blinelen(bp) < 10 || strncmp(p, "go object ", 10) != 0) +		return -1; +	Bseek(bp, -1, 1);  	/*  	 * Found one.  Skip until "\n!\n"  	 */ -	while((c = Bgetc(bp)) != Beof) { +	for(;;) { +		if((c = Bgetc(bp)) == Beof) +			return -1;  		if(c != '\n')  			continue;  		c = Bgetc(bp); @@ -156,8 +146,20 @@ Retry:  			Bungetc(bp);  			continue;  		} -		goto Retry; +		break;  	} + +	if(Bread(bp, buf, MAXIS) < MAXIS) +		return -1; +	Bseek(bp, -MAXIS, 1); +	for (i = 0; i < Maxobjtype; i++) { +		if (obj[i].is && (*obj[i].is)(buf)) { +			if (name) +				*name = obj[i].name; +			return i; +		} +	} +  	return -1;  } | 
