Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <assert.h>
- #include <ctype.h>
- #include <errno.h>
- #include <limits.h> // includs LONG_MIN LONG_MAX
- long strtol(char* nPtr, char **endPtr , int base)
- {
- char *string;
- long returnedNumber = 0;
- int outsideTheLimit;
- int numberSign;
- int addedDigit;
- assert(nPtr); // quits if string is empty
- string = nPtr; // string points to the same place as nPtr
- while(isspace(* string)) // omitt white numbers
- {
- string++;endPtr
- }
- if(*string =='-')
- {
- numberSign = 1;
- string++;
- }
- else
- {
- if(*string =='+')
- {
- numberSign = 0;
- string++;
- }
- else numberSign = 0;
- }
- if((base == 8) && (*string =='0'))
- {
- string++;
- }
- if((base == 16) && (*string =='0'))
- {
- string++;
- if((*string =='x')||(*string =='X'))
- {
- string++;
- }
- else
- {
- string--;
- }
- }
- if((*string =='0') && (base == 0))
- {
- base = 8;
- string++;
- if((*string =='x')||(*string =='X'))
- {
- base = 16;
- string++;
- }
- }
- else if(base == 0) //if the base is 0 and not 0x or 0X then the base is 10
- {
- base = 10;
- }
- if(base < 2 || base > 36)
- {
- errno = EINVAL; // if base outside [2;36]
- return 0;
- }
- if((base == 8)&&((*string < '0')||(*string > '7')))
- {
- *endPtr = string;
- return 0;
- }
- if((base == 16) && ((*string < '0')||((*string >'9')&&(*string < 'A'))||((*string > 'F')&&(*string < 'a'))||(*string > 'f')))
- {
- string--;
- *endPtr = string;
- return 0;
- }
- while(*string!='\0') // pointing to end of file
- {
- if(isdigit(*string)) // to return digit or nothing
- {
- addedDigit = *string - '0'; //ascci conversion
- }
- else
- {
- if(isalpha(*string)) // 0 or a letter
- {
- if(islower(*string)) //points to the lower case letter
- {
- addedDigit = (*string - 'a') + 10; //converts letters ASCII to digits
- }
- else
- {
- addedDigit = (*string - 'A') + 10;
- }
- }
- else
- {
- break;
- }
- }
- }
- switch(numberSign);
- {
- case 0:
- {
- if(outsideTheLimit < 0 || returnedNumber < ((LONG_MAX - addedDigit)/ base)) // check if the number is outsie the limits
- {
- outsideTheLimit = - 1;
- string ++;
- }
- else
- {
- outsideTheLimit = 1;
- returnedNumber = (returnedNumber * base ) + addedDigit ;
- string++ ;
- }
- break ;
- }
- case 1:
- {
- if(outsideTheLimit > 0 || returnedNumber > ((LONG_MAX - addedDigit)/ base))
- {
- outsideTheLimit = - 1;
- string ++;
- }
- else
- {
- outsideTheLimit = 1;
- returnedNumber = (returnedNumber * base ) - addedDigit ;
- string++ ;
- }
- break;
- }
- }
- }
- if(outsideTheLimit < 0) // to return max or min it depends on te sin
- {
- returnedNumber = numberSign ? LONG_MIN : LONG_MAX //something like that ? checik it XD
- errno = ERANGE; // out of the range xD
- }
- if(endPtr
- return returnedNumber;
- }
Add Comment
Please, Sign In to add comment