/* utils.c
 * $Id: utils.c,v 1.2.4.4 2005/08/01 12:12:02 becker Exp $
 * Ralf Becker <nctop@web.de>
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <signal.h>
#include <ctype.h>
#include "utils.h"

static char cvsid[] = "$Id: utils.c,v 1.2.4.4 2005/08/01 12:12:02 becker Exp $";

/* advance to next whitespace */
char *skip(const char *p) {

        while(isspace(*p)) {
                p++;
        }
        while((*p != '\0') && !isspace(*p)) {
                p++;
        }
        return (char *)p;
}

/* advance to begining of next line */
char *skip_line(const char *p) {

        while((*p != '\0') && (*p != '\n')) {
                p++;
        }
	if (*p != '\0') {
		p++;
	}
        return (char *)p;
}

/* skip token indicated by t */
char *skip_token(const char *p, const char *t) {

	while ((*p == *t) && (*t != '\0') && (*p != '\0')) {
		p++; t++;
	}
	return (char *)p;
}

void (*my_signal(int sig, void (*func)(int)))(int) {

	struct sigaction act,oact;

	act.sa_handler = func;
	sigemptyset(&act.sa_mask);
	act.sa_flags = 0;
	if (sigaction(sig, &act, &oact) == -1) {
		return SIG_ERR;
	}

	return oact.sa_handler;
}

/* check if c is in [a-zA-Z0-9] */
int isletdig(char c) {

	if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || 
		((c >= '0') && (c <= '9'))) {
		return 1;
	}
	return 0;
}

/* check if s is a valid domainname
 * valid names are 
 * <domain>      ::= <label> | <domain> "." <label>
 * <label>       ::= <let-dig> | <let-dig> <ldh-str> <label>
 * <ldh-str>     ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
 * <let-dig-hyp> ::= <let-dig> | "-"
 * <let-dig>     ::= [a-zA-Z0-9]
 * this check isn't RFC-compliant, but sufficent
 */

int isdomain(char *s) {

	if (!isletdig(*s)) {
		return 0;
	}

	for (; isletdig(*s); s++) {
	}
	
	for (; (*s == '-') || (isletdig(*s)); s++) {
	}

	if (*(s-1) == '-') {
		return 0;
	}

	if (*s == '.') {
		s++;
		return(isdomain(s));
	}

	if (*s == '\0') {
		return 1;
	}

	return 0;
	
}


syntax highlighted by Code2HTML, v. 0.9.1