#include "compiler.h"
// ---- ANK
#if defined(SUPPORT_ANK)
int milank_cmp(const char *str, const char *cmp) {
int s;
int c;
do {
s = (BYTE)*str++;
if (((s - 'a') & 0xff) < 26) {
s -= 0x20;
}
c = (BYTE)*cmp++;
if (((c - 'a') & 0xff) < 26) {
c -= 0x20;
}
if (s != c) {
return((s > c)?1:-1);
}
} while(s);
return(0);
}
int milank_memcmp(const char *str, const char *cmp) {
int s;
int c;
do {
c = (BYTE)*cmp++;
if (c == 0) {
return(0);
}
if (((c - 'a') & 0xff) < 26) {
c -= 0x20;
}
s = (BYTE)*str++;
if (((s - 'a') & 0xff) < 26) {
s -= 0x20;
}
} while(s == c);
return((s > c)?1:-1);
}
void milank_ncpy(char *dst, const char *src, int maxlen) {
int i;
if (maxlen > 0) {
maxlen--;
for (i=0; i<maxlen && src[i]; i++) {
dst[i] = src[i];
}
dst[i] = '\0';
}
}
void milank_ncat(char *dst, const char *src, int maxlen) {
int i;
int j;
if (maxlen > 0) {
maxlen--;
for (i=0; i<maxlen; i++) {
if (!dst[i]) {
break;
}
}
for (j=0; i<maxlen && src[j]; i++, j++) {
dst[i] = src[j];
}
dst[i] = '\0';
}
}
char *milank_chr(const char *str, int c) {
int s;
if (str) {
do {
s = *str;
if (s == c) {
return((char *)str);
}
str++;
} while(s);
}
return(NULL);
}
#endif
// ---- Shift-JIS
#if defined(SUPPORT_SJIS)
int milsjis_cmp(const char *str, const char *cmp) {
int s;
int c;
do {
s = (BYTE)*str++;
if ((((s ^ 0x20) - 0xa1) & 0xff) < 0x3c) {
c = (BYTE)*cmp++;
if (s != c) {
goto mscp_err;
}
s = (BYTE)*str++;
c = (BYTE)*cmp++;
}
else {
if (((s - 'a') & 0xff) < 26) {
s -= 0x20;
}
c = (BYTE)*cmp++;
if (((c - 'a') & 0xff) < 26) {
c -= 0x20;
}
}
if (s != c) {
goto mscp_err;
}
} while(s);
return(0);
mscp_err:
return((s > c)?1:-1);
}
int milsjis_memcmp(const char *str, const char *cmp) {
int s;
int c;
do {
c = (BYTE)*cmp++;
if ((((c ^ 0x20) - 0xa1) & 0xff) < 0x3c) {
s = (BYTE)*str++;
if (c != s) {
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((s > c)?1:-1);
}
int milsjis_kanji1st(const char *str, int pos) {
int ret;
ret = 0;
while((pos >= 0) &&
((((str[pos--] ^ 0x20) - 0xa1) & 0xff) < 0x3c)) {
ret ^= 1;
}
return(ret);
}
int milsjis_kanji2nd(const char *str, int pos) {
int ret = 0;
while((pos > 0) && ((((str[--pos] ^ 0x20) - 0xa1) & 0xff) < 0x3c)) {
ret ^= 1;
}
return(ret);
}
void milsjis_ncpy(char *dst, const char *src, int maxlen) {
int i;
if (maxlen > 0) {
maxlen--;
for (i=0; i<maxlen && src[i]; i++) {
dst[i] = src[i];
}
if (i) {
if (milsjis_kanji1st(src, i-1)) {
i--;
}
}
dst[i] = '\0';
}
}
void milsjis_ncat(char *dst, const char *src, int maxlen) {
int i;
int j;
if (maxlen > 0) {
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 > 0) && (j > 0)) {
if (milsjis_kanji1st(dst, i-1)) {
i--;
}
}
dst[i] = '\0';
}
}
char *milsjis_chr(const char *str, int c) {
int s;
if (str) {
do {
s = *str;
if (s == c) {
return((char *)str);
}
if ((((s ^ 0x20) - 0xa1) & 0xff) < 0x3c) {
str++;
s = *str;
}
str++;
} while(s);
}
return(NULL);
}
#endif
// ---- EUC
#if defined(SUPPORT_EUC)
int mileuc_cmp(const char *str, const char *cmp) {
int s;
int c;
do {
s = (BYTE)*str++;
if (((s - 0xa1) & 0xff) < 0x5d) {
c = (BYTE)*cmp++;
if (s != c) {
goto mscp_err;
}
s = (BYTE)*str++;
c = (BYTE)*cmp++;
}
else {
if (((s - 'a') & 0xff) < 26) {
s -= 0x20;
}
c = (BYTE)*cmp++;
if (((c - 'a') & 0xff) < 26) {
c -= 0x20;
}
}
if (s != c) {
goto mscp_err;
}
} while(s);
return(0);
mscp_err:
return((s > c)?1:-1);
}
int mileuc_memcmp(const char *str, const char *cmp) {
int s;
int c;
do {
c = (BYTE)*cmp++;
if (((c - 0xa1) & 0xff) < 0x5d) {
s = (BYTE)*str++;
if (c != s) {
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((s > c)?1:-1);
}
int mileuc_kanji1st(const char *str, int pos) {
int ret;
ret = 0;
while((pos >= 0) &&
(((str[pos--] - 0xa1) & 0xff) < 0x5d)) {
ret ^= 1;
}
return(ret);
}
int mileuc_kanji2nd(const char *str, int pos) {
int ret = 0;
while((pos > 0) && (((str[--pos] - 0xa1) & 0xff) < 0x5d)) {
ret ^= 1;
}
return(ret);
}
void mileuc_ncpy(char *dst, const char *src, int maxlen) {
int i;
if (maxlen > 0) {
maxlen--;
for (i=0; i<maxlen && src[i]; i++) {
dst[i] = src[i];
}
if (i) {
if (mileuc_kanji1st(src, i-1)) {
i--;
}
}
dst[i] = '\0';
}
}
void mileuc_ncat(char *dst, const char *src, int maxlen) {
int i;
int j;
if (maxlen > 0) {
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 > 0) && (j > 0)) {
if (mileuc_kanji1st(dst, i-1)) {
i--;
}
}
dst[i] = '\0';
}
}
char *mileuc_chr(const char *str, int c) {
int s;
if (str) {
do {
s = *str;
if (s == c) {
return((char *)str);
}
if (((s - 0xa1) & 0xff) < 0x5d) {
str++;
s = *str;
}
str++;
} while(s);
}
return(NULL);
}
#endif
// ---- other
int milstr_extendcmp(const char *str, const char *cmp) {
int c;
int s;
do {
while(1) {
c = (BYTE)*cmp++;
if (!c) {
return(0);
}
if (((c - '0') & 0xff) < 10) {
break;
}
c |= 0x20;
if (((c - 'a') & 0xff) < 26) {
break;
}
}
while(1) {
s = *str++;
if (!s) {
break;
}
if (((s - '0') & 0xff) < 10) {
break;
}
s |= 0x20;
if (((s - 'a') & 0xff) < 26) {
break;
}
}
} while(s == c);
return((s > c)?1:-1);
}
char *milstr_nextword(const char *str) {
if (str) {
while(!(((*str) - 1) & 0xe0)) {
str++;
}
}
return((char *)str);
}
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);
}
char *milstr_list(const char *lststr, UINT pos) {
if (lststr) {
while(pos) {
pos--;
while(*lststr++ != '\0') {
}
}
}
return((char *)lststr);
}
RetroPC.NET-CVS <cvs@retropc.net>