code: plan9front

ref: e72da62915b09d5673b0c0179ba8dfe045aeb8c3
dir: /sys/src/libventi/parsescore.c/

View raw version
#include <u.h>
#include <libc.h>
#include <venti.h>

int
vtparsescore(char *s, char **prefix, uchar score[VtScoreSize])
{
	int i, c;
	char *buf, *colon;

	if((colon = strchr(s, ':')) != nil)
		buf = colon+1;
	else
		buf = s;

	if(strlen(buf) != 2*VtScoreSize)
		return -1;

	memset(score, 0, VtScoreSize);
	for(i=0; i<2*VtScoreSize; i++){
		if(buf[i] >= '0' && buf[i] <= '9')
			c = buf[i] - '0';
		else if(buf[i] >= 'a' && buf[i] <= 'z')
			c = buf[i] - 'a' + 10;
		else if(buf[i] >= 'A' && buf[i] <= 'Z')
			c = buf[i] - 'A' + 10;
		else
			return -1;

		if((i & 1) == 0)
			c <<= 4;
		score[i>>1] |= c;
	}
	if(colon){
		*colon = 0;
		if(prefix)
			*prefix = s;
	}else{
		if(prefix)
			*prefix = nil;
	}
	return 0;
}