[ LIBC ]Przewidywanie czy liczba się zmieści w zmiennej
Ostatnio zmodyfikowano 2014-03-09 18:44
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 strtol u mnie znajduje się w pliku strtol.c i wygląda tak: #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: while( * s >= '0' && * s <( base + '0' ) ) l = l * base +( * s++ ) - '0';
który powinien wyglądać tak while( * s >= '0' && * s <( base + '0' ) ) { if( ) l = l * base +( * s++ ) - '0'; else { set_errno( ERANGE ); return sign ? LONG_MIN: LONG_MAX; } }
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 :) |
|
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ć. |
|
Brezniew Temat założony przez niniejszego użytkownika |
» 2014-03-09 18:44:20 Czyli tak: if(( LONG_MAX -( * s - '0' ) ) / base >= l ) l = l * base +( * s++ ) - '0';
? |
|
« 1 » |