File:  [RetroPC.NET] / np2 / common / milstr.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Fri Oct 17 02:57:09 2003 JST (22 years ago) by yui
Branches: mie
CVS tags: start, rel_036
Neko Project II

#include	"compiler.h"


BOOL milstr_cmp(const char *str, const char *cmp) {

	int		s;
	int		c;

	while(1) {
		s = (BYTE)*str++;
		if ((((s ^ 0x20) - 0xa1) & 0xff) < 0x3c) {
			if (s != (BYTE)*cmp++) {
				goto mscp_err;
			}
			s = (BYTE)*str++;
			c = (BYTE)*cmp++;
		}
		else {
			if (((s - 'A') & 0xff) < 0x1a) {
				s |= 0x20;
			}
			c = (BYTE)*cmp++;
			if (((c - 'A') & 0xff) < 0x1a) {
				c |= 0x20;
			}
		}
		if (s != c) {
			goto mscp_err;
		}
		if (!s) {
			break;
		}
	}
	return(0);

mscp_err:
	return(1);
}

BOOL milstr_memcmp(const char *str, const char *cmp) {

	int		s;
	int		c;

	do {
		c = (BYTE)*cmp++;
		if ((((c ^ 0x20) - 0xa1) & 0xff) < 0x3c) {
			if (c != (BYTE)*str++) {
				break;
			}
			c = (BYTE)*cmp++;
			s = (BYTE)*str++;
		}
		else if (c) {
			if (((c - 'A') & 0xff) < 26) {
				c |= 0x20;
			}
			s = (BYTE)*str++;
			if (((s - 'A') & 0xff) < 26) {
				s |= 0x20;
			}
		}
		else {
			return(0);
		}
	} while(s == c);
	return(1);
}

BOOL milstr_extendcmp(const char *str, const char *cmp) {

	char	c, s = '\0';

	while(*cmp) {
		while(*cmp) {
			s = *cmp++;
			if (!s) {
				return(0);
			}
			if ((s >= '0') && (s <= '9')) {
				break;
			}
			s &= 0xdf;
			if ((s >= 'A') && (s <= 'Z')) {
				break;
			}
		}
		while(1) {
			c = *str++;
			if (!c) {
				return(1);
			}
			if ((c >= '0') && (c <= '9')) {
				break;
			}
			c &= 0xdf;
			if ((c >= 'A') && (c <= 'Z')) {
				break;
			}
		}
		if (c != s) {
			return(1);
		}
	}
	return(0);
}

int milstr_kanji1st(const char *str, int pos) {

	int		ret;

	ret = 0;
	while((pos >= 0) &&
		((((str[pos--] ^ 0x20) - 0xa1) & 0xff) < 0x3c)) {
		ret ^= 1;
	}
	return(ret);
}

int milstr_kanji2nd(const char *str, int pos) {

	int		ret = 0;

	while((pos) && ((((str[--pos] ^ 0x20) - 0xa1) & 0xff) < 0x3c)) {
		ret ^= 1;
	}
	return(ret);
}

void milstr_ncpy(char *dst, const char *src, int maxlen) {

	int		i;

	if (maxlen--) {
		for (i=0; i<maxlen && src[i]; i++) {
			dst[i] = src[i];
		}
		if (i) {
			if (milstr_kanji1st(src, i-1)) {
				i--;
			}
		}
		dst[i] = '\0';
	}
}

void milstr_ncat(char *dst, const char *src, int maxlen) {

	int		i;
	int		j;

	if (maxlen--) {
		for (i=0; i<maxlen; i++) {
			if (!dst[i]) break;
		}
		for (j=0; i<maxlen && src[j]; i++, j++) {
			dst[i] = src[j];
		}
		if ((i) && (j)) {
			if (milstr_kanji1st(dst, i-1)) {
				i--;
			}
		}
		dst[i] = '\0';
	}
}

int milstr_getarg(char *str, char *arg[], int maxarg) {

	int		ret = 0;
	char	*p;
	BOOL	quot;

	while(maxarg--) {
		quot = FALSE;
		while((*str) && (((BYTE)*str) <= 0x20)) {
			str++;
		}
		if (*str == '\0') {
			break;
		}
		arg[ret++] = str;
		p = str;
		while(*str) {
			if (*str == 0x22) {
				quot = !quot;
			}
			else if ((((BYTE)*str) > 0x20) || (quot)) {
				*p++ = *str;
			}
			else {
				str++;
				break;
			}
			str++;
		}
		*p = '\0';
	}
	return(ret);
}

long milstr_solveHEX(const char *str) {

	long	ret;
	int		i;
	char	c;

	ret = 0;
	for (i=0; i<8; i++) {
		c = *str++;
		if ((c >= '0') && (c <= '9')) {
			c -= '0';
		}
		else if ((c >= 'A') && (c <= 'F')) {
			c -= '7';
		}
		else if ((c >= 'a') && (c <= 'f')) {
			c -= 'W';
		}
		else {
			break;
		}
		ret <<= 4;
		ret += (long)c;
	}
	return(ret);
}

long milstr_solveINT(const char *str) {

	long	ret;
	int		c;
	int		s = 1;

	ret = 0;
	c = *str;
	if (c == '+') {
		str++;
	}
	else if (c == '-') {
		str++;
		s = -1;
	}
	while(1) {
		c = *str++;
		c -= '0';
		if ((unsigned)c < 10) {
			ret *= 10;
			ret += c;
		}
		else {
			break;
		}
	}
	return(ret * s);
}


RetroPC.NET-CVS <cvs@retropc.net>