From b4ba872397c331277f0410f5e18bf2ae319b2e62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Sat, 18 Aug 2018 18:37:18 +0200 Subject: [PATCH] feat: ajout de fonctions dans la librairie string - entiers & listes --- include/string.h | 6 ++ lib/string.c | 154 ++++++++++++++++++++++++++++++++++++++++++++++- system/system.c | 23 ++++--- 3 files changed, 173 insertions(+), 10 deletions(-) diff --git a/include/string.h b/include/string.h index 16ece1e..2225a39 100755 --- a/include/string.h +++ b/include/string.h @@ -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); diff --git a/lib/string.c b/lib/string.c index 64248f2..76a2293 100755 --- a/lib/string.c +++ b/lib/string.c @@ -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) && (imax) + 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; +} diff --git a/system/system.c b/system/system.c index 432155d..8377076 100755 --- a/system/system.c +++ b/system/system.c @@ -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);