#include "scheduled.h"
#include "byte.h"
#include "scan.h"

int 
preparse_schedspec(struct schedinfo *si, const char *s, unsigned int len)
{
	unsigned int i;

	static unsigned char allowed[256];
	static int init_done=0;
	if (!init_done) {
		init_done++;
		allowed[',']=1; allowed['0']=1; allowed['1']=1;
		allowed['2']=1; allowed['3']=1; allowed['4']=1;
		allowed['5']=1; allowed['6']=1; allowed['7']=1;
		allowed['8']=1; allowed['9']=1;
	}

	si->Y=0; si->Ylen=0;
	si->M=0; si->Mlen=0;
	si->D=0; si->Dlen=0;
	si->h=0; si->hlen=0;
	si->m=0; si->mlen=0;
	si->s=0; si->slen=0;
	si->W=0;
	for (i=0;i<len;) {
		unsigned int j;
		int iswd=0;
		const char **p=0;
		unsigned int *pl=0;
		switch (s[i]) {
		case 'Y': p=&si->Y; pl=&si->Ylen; break; 
		case 'M': p=&si->M; pl=&si->Mlen; break; 
		case 'D': p=&si->D; pl=&si->Dlen; break; 
		case 'W': iswd=1; break; 
		case 'h': p=&si->h; pl=&si->hlen; break; 
		case 'm': p=&si->m; pl=&si->mlen; break; 
		case 's': p=&si->s; pl=&si->slen; break; 
		default: return 0;
		}
		i++;
		if (i==len)
			return 0;
		j=i;
		if (p)
			*p=s+j;
		while (j<len && allowed[(unsigned char)s[j]])
			j++;
		if (j==i)
			return 0;
		if (pl)
			*pl=j-i;
		if (iswd) {
			char nb[4];
			unsigned long ul;
			unsigned int k;
			if (j-i>sizeof(nb)-1) /* 3 characters are enough */
				return 0;
			byte_copy(nb,j-i,s+i);
			nb[j-i]=0;
			k=scan_ulong(nb,&ul);
			if (k!=j-i)
				return 0;
			if (ul>127)
				return 0;
			si->W=ul;
		}	
		i=j;
	}
	return 1;
}





syntax highlighted by Code2HTML, v. 0.9.1