Files
checker_m4/source/soft/mystring.c

345 lines
4.9 KiB
C
Raw Normal View History

2023-06-25 15:30:36 +08:00
#include "stdlib.h"
#include "mystdlib.h"
#include "mystring.h"
#include "bytearray.h"
#include "board.h"
#include "string.h"
/*
*
* s中首次出现字符c的指针,0
* char *s=str_find_char_right("abcdef",'c')
* s="cdef"
*
*/
const char *str_find_char_right(const char *s,char c)
{
while(*s){
if(*s==c) return s;
s++;
}
return 0;
}
/*
*
* s中首次出现字符c的指针,0,
* p是向右检索的终点
* char *s=str_find_char_right("abcdef",'c')
* s="cdef"
*
*/
const char *str_find_char_right_p(const char *s, const char *const p, char c)
{
while (*s++)
{
if (*s == c) return s;
if (s >= p) break;
}
return 0;
}
/*
*
* s中首次出现字符c的指针,0
* p是向左检索的终点s检索开始
* char *t="abcdef";
* char *s;
* s=str_find_char_left(t,t+4,'b');
* s="bcdef"
*
*/
const char *str_find_char_left(const char *const p,const char *s,char c)
{
while(*s--)
{
if(*s==c) return s;
if(s<=p) break;
}
return 0;
}
/*
*
* s
*
*/
int str_len(const char *s)
{
int len=0;
while(*s++) len++;
return len;
}
/*
*
* s2 s1 n
*
*/
void str_memcpy(char *s1,const char *s2,int n)
{
while(n--)
*s1++=*s2++;
}
/*
*
* s2 c s1
*
*/
int str_cpystr(char *s1,const char *s2,char c)
{
int len;
const char *str=str_find_char_right((char *)s2,c);
if(str==0) len=str_len(s2);
else len=str-s2;
str_memcpy(s1,s2,len);
s1[len]=0;
return len;
}
/*
*
* int,
*
*/
static int str_ainttoi(const char *s)
{
int ret=0;
int sig=1;
if(*s=='-'){
s++;
sig=-1;
}
while(*s)
{
if(*s>='0'&&*s<='9')
{
ret*=10;
ret+=*s-'0';
}
else return ret;
s++;
}
return ret*sig;
}
int str_ahextoi(const char *s)
{
int ret=0;
while(*s)
{
if(*s>='0'&&*s<='9')
{
ret*=16;
ret+=*s-'0';
}
else if(*s>='a'&&*s<='f')
{
ret*=16;
ret+=*s-'a'+10;
}
else if(*s>='A'&&*s<='F')
{
ret*=16;
ret+=*s-'A'+10;
}
else return ret;
s++;
}
return ret;
}
int str_atoi(const char *s)
{
if(s[0]=='0'&&((s[1]=='x')||(s[1]=='X'))){
return str_ahextoi(&s[2]);
}else{
return str_ainttoi(s);
}
}
/*
*
* c分割为列表
*
*/
list_def *str_split(const char *s,char c)
{
int len=str_len(s)+1;
char *t=malloc(len);
char *ptr1,*ptr2;
list_def *l=list_creat_str();
str_memcpy(t,s,len);
ptr1=t;
ptr2=t;
while(*ptr1)
{
if(*ptr1==c){
*ptr1=0;
list_append_str(l,ptr2);
ptr2=ptr1+1;
}
ptr1++;
}
list_append_str(l,ptr2);
free(t);
return list_temp(l);
}
/*
*
* c
*
*/
list_def *str_atod_list(const char *s, char c)
{
list_def *sl=str_split(s,c);
list_def *dl=list_creat_int();
for(int i=0;i<list_length(sl);i++)
{
int n;
char *d=list_get_str(sl,i);
n=str_atoi(d);
list_append_int(dl,n);
}
return tappend(dl,0);
}
/*
*
* ,1,0
*
*/
static inline int str_is_empty_char(char c)
{
const char table[]="\t\n\v\f\r ";
if(str_find_char_right(table,c)!=0)
return 1;
else
return 0;
}
/*
*
* ,1,0
*
*/
int str_is_print_str(const char *str,int len)
{
for(int i=0;i<len;i++)
{
// 既不是空白字符也不是可打印字符
if(!(str_is_empty_char(str[i])||(str[i]>=' '&&str[i]<='~')))
return 0;
}
return 1;
}
/*
*
* '\t', '\n', '\v', '\f', '\r', and ' ',
*
*/
char *str_simplified(const char *str)
{
int is_empty=0;
array_def *arr=arr_creat();
param_check(arr);
while(str_is_empty_char(*str)){
str++;
}
while(*str){
if(str_is_empty_char(*str)==0){
if(is_empty==1){
arr_append(arr,' ');
is_empty=0;
}
arr_append(arr,*str);
}else{
is_empty=1;
}
str++;
}
char *ret=tmalloc(arr_length(arr)+1);
param_check(ret);
memcpy(ret,arr_data(arr),arr_length(arr));
ret[arr_length(arr)]=0;
arr_delete(arr);
return ret;
}
/*
*
*
*
*/
void _str_set(char **p,const char *str)
{
param_check(p);
int len=0;
if(str)
len=str_len(str);
else
len=0;
if(*p!=0)
{
free(*p);
}
*p=malloc(len+1);
str_cpystr(*p,str,len);
(*p)[len]=0;
}
/*
*
*
*
*/
char *str_duplicate(char *p)
{
int len=str_len(p);
char *s=malloc(len+1);
param_check(s);
str_cpystr(s,p,len+1);
return s;
}