feat: ajout de fonctions dans la librairie string - entiers & listes

This commit is contained in:
Nicolas Hordé 2018-08-18 18:37:18 +02:00
parent 539eeb1d8f
commit b4ba872397
3 changed files with 173 additions and 10 deletions

View File

@ -18,3 +18,9 @@ void strleft(u8 *src, u8 *dest, u32 size);
void strdelete(u8 *src, u32 index, u32 size);
void strcompressdelimiter(u8 *src, u8 delim);
void strinsert(u8 *src, u8 *dest, u32 index);
u8 *strgetitem(u8 *src, u8 *dest, u8 delim, u32 index);
u8* strgetpointeritem(u8 *src, u8 delim, u32 index);
u32 strgetnbitems(u8 *src, u8 delim);
u8 strgetminbase(u8 *src);
u8 strgetbase(u8 *src);
u32 strtoint(u8 *src);

View File

@ -17,7 +17,7 @@ s8 strcmp(const u8 * src, const u8 * dest)
/******************************************************************************/
/* Trouve la premiere occurence d'un caractère dans une chaine */
/* Trouve la premiere occurence d'un caractère dans une chaine et renvoie un pointeur */
u8 *strchr(const u8 * src, u8 achar)
{
@ -29,6 +29,19 @@ u8 *strchr(const u8 * src, u8 achar)
/******************************************************************************/
/* Trouve la premiere occurence d'un caractère dans une chaine */
u32 strchrpos(const u8 * src, u8 achar)
{
u32 i;
for (i=0; *(src+i) != achar; ++i)
if (*(src+i) == 0)
return 0;
return i;
}
/******************************************************************************/
/* Renvoie la taille de la chaine */
u32 strlen(const u8 * src)
@ -191,7 +204,7 @@ u8 *strfill(u8 *dst, u8 pattern, u32 size)
/* Renvoie la partie gauche d'une chaine */
void strright(u8 *src, u8 *dest, u32 size) {
void strleft(u8 *src, u8 *dest, u32 size) {
u32 i;
for (i = 0; (*(src + i) != 0) && (i<size); i++)
*dest++=*(src + i);
@ -202,7 +215,7 @@ void strright(u8 *src, u8 *dest, u32 size) {
/* Renvoie la partie droite d'une chaine */
void strleft(u8 *src, u8 *dest, u32 size) {
void strright(u8 *src, u8 *dest, u32 size) {
u32 i;
u32 begin=strlen(src)-size;
for (i = 0; (*(src + i + begin) != 0) && (i<size); i++)
@ -251,3 +264,138 @@ void strcompressdelimiter(u8 *src, u8 delim) {
pos=strchr(pos+1, delim);
}
}
/******************************************************************************/
/* Récupérère l'élément N d'une liste utilisant un délimiteur */
u8* strgetitem(u8 *src, u8 *dest, u8 delim, u32 index) {
u32 i;
u8* pos=strgetpointeritem(src,delim,index);
for (i = 0; (*(pos+i) != 0) && (*(pos+i) != delim); i++)
*(dest+i)=*(pos+i);
*(dest+i)='\000';
return dest;
}
/******************************************************************************/
/* Récupérère un pointeur sur l'élément N d'une liste utilisant un délimiteur */
u8* strgetpointeritem(u8 *src, u8 delim, u32 index) {
u32 i;
u8* pos=src;
for (i = 0; i<index; i++)
pos=strchr(pos+1, delim);
if (*pos == delim) pos++;
return pos;
}
/******************************************************************************/
/* Récupérère le nombre d'éléments d'une liste utilisant un délimiteur */
u32 strgetnbitems(u8 *src, u8 delim) {
u32 number=0;
if (*src==0) return 0;
number++;
u8 *pos=strchr(src, delim);
while (pos!=0)
{
pos=strchr(pos+1, delim);
number++;
}
return number;
}
/******************************************************************************/
/* Renvoie la base minimum du nombre */
u8 base[]=" 0123456789ABCDEF\000";
u8 strgetminbase(u8 *src) {
u8 temp[]=" \000";
u8 *dst=&temp;
strtoupper(strcpy(src, &temp));
u8 max=0;
while (*dst!=0) {
u32 result=strchrpos(&base,*dst++);
if (result==0)
return 0;
if (result>max)
max=result;
}
if (max>10)
return 16;
else if (max>8)
return 10;
else if (max>2)
return 8;
else
return 2;
}
/******************************************************************************/
/* Renvoie la base du nombre */
u8 hexa[]="0x\000";
u8 bases[]=" bodh\000";
u8 basesnum[]={0,2,8,10,16};
u8 declaredbase=10;
u8 minbase=0;
u8 strgetbase(u8 *src) {
u8 temp[]=" \000";
strleft(src,&temp,2);
if (strcmp(&temp,&hexa)==0) {
declaredbase=16;
u8 size=strlen(src);
strright(src,&temp,size-2);
minbase=strgetminbase(&temp);
}
else {
strright(src,&temp,1);
declaredbase=basesnum[strchrpos(&bases,temp[0])];
if (declaredbase>0) {
u8 size=strlen(src);
strleft(src,&temp,size-1);
minbase=strgetminbase(&temp);
}
else
{
minbase=strgetminbase(src);
declaredbase=minbase;
}
}
if (declaredbase>=minbase && minbase!=0)
return declaredbase;
else
return 0;
}
/******************************************************************************/
/* Renvoie la base du nombre */
u32 strtoint(u8 *src) {
u8* temp=src;
u32 result=0;
u8 thebase=strgetbase(src);
u32 multi=1;
u8 shorter=0;
if (thebase==0) return 0;
if (*(src+1)=='x') shorter=2;
while (*++temp!=0);
while (*temp==0 || *temp=='b' || *temp=='o' || *temp=='d' || *temp=='h')
temp--;
while (src+shorter<=temp) {
u8 achar=*temp--;
if ((achar >= 'a') && (achar <= 'z'))
achar=achar-('a'-'A');
result=result+multi*(strchrpos(&base,achar)-1);
multi=multi*thebase;
}
return result;
}

View File

@ -82,14 +82,23 @@ int main(void)
&cpu.techs);
ok();
u8 dest[]="Ceci est un test pour voir si cela fonctionne correctement\000 ";
printf(&dest);
u8 src[]="POPPOPPOP\000";
u8 test[]="0101011101b\000";
u8 test2[]="12106567h\000";
u8 test3[]="11A1baA7d\000";
u8 test4[]="11454589d\000";
u8 test5[]="0x11A1b7\000";
u8 test6[]="0x11A1B7h\000";
u8 test7[]="129220\000";
u8 dest[]=" \000";
u8 src[]="Ceci est un test pour voir si cela fonctionne correctement\000 ";
printf(&src);
printf("\r\n");
strinsert(&src, &dest, 14);
printf(&dest);
strtoint(&test);
strtoint(&test2);
strtoint(&test3);
strtoint(&test4);
strtoint(&test5);
strtoint(&test6);
strtoint(&test7);
while (1) {
key = waitascii();
putchar(key);