Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[ LIBC ]Przewidywanie czy liczba się zmieści w zmiennej

Ostatnio zmodyfikowano 2014-03-09 18:44
Autor Wiadomość
Brezniew
Temat założony przez niniejszego użytkownika
[ LIBC ]Przewidywanie czy liczba się zmieści w zmiennej
» 2014-03-07 22:38:07
Witam. :)

Pisząc system operacyjny, w pewnym momencie zaszła potrzeba użycia bibliotek standardowych C, a na tym wczesnym etapie nie mogę użyć istniejących bibliotek C takich jak glibc czy newlibc( choć tu jest prościej ze względu na mocno uproszczony kod ). W związku z tym pisze własną bibliotekę zgodną ze standardami.
Aktualnie pisze funkcje » standard Cstrtol u mnie znajduje się w pliku strtol.c i wygląda tak:

C/C++
#include <string.h>
#include <limits.h>
#include <stdbool.h>
#include <bits/errno.h>

long strtol( const char * start, char ** end, int base )
{
    long l = 0;
    bool sign = false;
    const char * s = start;
   
    if( * s == '-' )
    {
        sign = true;
        s++;
    }
   
    if( base == 0 )
    {
        if( s[ 0 ] == '0' )
        {
            if( s[ 1 ] == 'x' || s[ 1 ] == 'X' )
                 base = 16;
           
            else
                 base = 8;
           
        }
        else if( s[ 0 ] >= '1' && s[ 0 ] <= '9' )
             base = 10;
       
        else
        {
            if( sign ) * end = s - 1;
            else if( end != NULL ) * end = s;
           
            return 0;
        }
    }
    else if( base < 2 || base > 32 )
    {
        if( sign ) * end = s - 1;
        else if( end != NULL ) * end = s;
       
        return 0;
    }
   
    if( base == 16 )
    {
        if( s[ 0 ] == '0' &&( s[ 1 ] == 'x' || s[ 1 ] == 'X' ) )
             s += 2;
       
    }
   
    while( * s == '0' )
         s++;
   
    while( * s >= '0' && * s <( base + '0' ) )
         l = l * base +( * s++ ) - '0';
   
    if( end != NULL ) * end = s;
   
    return sign ? - l: l;
}

Działa poprawnie lecz nie jest zgodna ze standardem :P.

Przez kod:
C/C++
// ...
while( * s >= '0' && * s <( base + '0' ) )
     l = l * base +( * s++ ) - '0';
// ...

który powinien wyglądać tak

C/C++
// ...
while( * s >= '0' && * s <( base + '0' ) )
{
    if( /* Warunek przewidujący czy liczba się zmieści w zmiennej l */ )
         l = l * base +( * s++ ) - '0';
   
    else
    {
        set_errno( ERANGE ); //Makro ustawiające numer błędu.
        return sign ? LONG_MIN: LONG_MAX; //#include <limits.h>
    }
}
// ...

Nie mam pojęcia jak ten warunek zapisać :P.
Jeśli wie ktoś jak to zapisać to proszę o pomoc, albo jakieś podpowiedzi co do kodu :)
P-105818
pekfos
» 2014-03-09 14:50:49
Wykonaj operację przeciwną na wartości maksymalnej i porównaj ze zmienną, do której dane chcesz dopisać.
P-105917
Brezniew
Temat założony przez niniejszego użytkownika
» 2014-03-09 18:44:20
Czyli tak:
C/C++
if(( LONG_MAX -( * s - '0' ) ) / base >= l )
     l = l * base +( * s++ ) - '0';

 ?
P-105943
« 1 »
  Strona 1 z 1