Casio_asm/common/string.c

156 lines
2.7 KiB
C

#include "string.h"
char RETVAL[36];
void strcpyl(char* src, char* dest, int max) {
for(int i=0; i<max&&*src; i++) *(dest++)=*(src++);
}
int strcmpl(char* src, char* cmp, int max) {
for(int i=0; i<max&&*src; i++) {
if(*(cmp++)!=*(src++)) return 0;
}
return 1;
}
int strsuml(char* str, int max) {
int hash=7;
for(int i=0; i<max&&str[i]; i++) {
hash*=31;
hash+=str[i];
}
return hash;
}
int strlenl(char* str, int max) {
int i=0;
while(*str&&i<max) {
str++;
i++;
}
return i;
}
void strcpyd(char* src, char* dest) {
while(*src) *(dest++)=*(src++);
*dest='\0';
}
int strcmpd(char* src, char* cmp) {
while(*src||*cmp) {
if(*(cmp++)!=*(src++)) return 0;
}
return 1;
}
int strsumd(char* str) {
int hash=7;
for(int i=0; str[i]; i++) {
hash*=31;
hash+=str[i];
}
return hash;
}
int strlend(char* str) {
int i=0;
while(*str) {
str++;
i++;
}
return i;
}
void strcpyt(char* src, char* dest, char end) {
while(*src!=end) *(dest++)=*(src++);
}
int strcmpt(char* src, char* cmp, char end) {
while(*src!=end||*cmp!=end) {
if(*(cmp++)!=*(src++)) return 0;
}
return 1;
}
int strsumt(char* str, char end) {
int hash=7;
for(int i=0; str[i]!=end; i++) {
hash*=31;
hash+=str[i];
}
return hash;
}
int strlent(char* str, char end) {
int i=0;
while(*str!=end) {
str++;
i++;
}
return i;
}
#define hexdigit(val) ((val)>9?((val)+'a'-10):((val)+'0'))
#define decdigit(val) ((val)+'0')
char* itohex(int val, int digits) {
for(int i=0; i<digits; i++) {
int part=val>>4*i;
RETVAL[digits-i-1]=hexdigit(part&0xf);
}
RETVAL[digits]='\0';
return RETVAL;
}
char* itobin(int val, int digits) {
for(int i=0; i<digits; i++) {
int part=val>>i;
RETVAL[digits-i-1]=decdigit(part&0x1);
}
RETVAL[digits]='\0';
return RETVAL;
}
char* itodec(int val) {
int pos=31;
int neg=0;
RETVAL[32]='\0';
if(val==0) {
RETVAL[31]='0';
return RETVAL+31;
} else if(val<0) {
neg=1;
val=-val;
}
while(val) {
RETVAL[pos--]=decdigit(val%10);
val/=10;
}
if(neg) {
RETVAL[pos--]='-';
}
return RETVAL+pos+1;
}
#define digitval(digit) (((digit)>='a')?((digit)-'a'+10):((digit)>='A')?((digit)-'A'+10):(digit)-'0')
#define isDec(c) (((c)>='0'&&(c)<='9'))
#define isHex(c) (((c)>='A'&&(c)<='F')||((c)>='a'&&(c)<='f')||isDec((c)))
#define isBin(c) ((c)=='0'||(c)=='1')
int hextoi(char* str) {
int val=0;
while(isHex(*str)) {
val<<=4;
val|=digitval(*str);
str++;
}
return val;
}
int dectoi(char* str) {
int val=0;
int sgn=*str=='-'?-1:1;
if(*str=='-'||*str=='+') str++;
while(isDec(*str)) {
val*=10;
val|=digitval(*str);
str++;
}
return val*sgn;
}
int bintoi(char* str) {
int val=0;
while(isBin(*str)) {
val<<=1;
val|=digitval(*str);
str++;
}
return val;
}