/* strtoul example */
#include <stdio.h> /* printf, NULL */
#include <stdlib.h> /* strtoul */
#include <errno.h>
signed int GetIdentifier(const char* idString)
{
char *str_end;
int id = -1;
errno = 0;
id = strtoul(idString, &str_end, 16);
printf("Id (%s) - str_end %s - errno %d.\n", idString, str_end, errno);
if ( *str_end != '\0' || (errno == ERANGE))
{
printf("Error while converting Id (%s) - str_end %s - errno %d.\n", idString, str_end, errno);
return -1;
}
// Return error if converted Id is more than 29-bit
if(id > 0x1FFFFFFF)
{
printf("Error: Id (%s) should fit on 29 bits (maximum value: 0x1FFFFFFF).\n", idString);
return -1;
}
printf("sucess\n");
return id;
}
int main ()
{
GetIdentifier("inv");
GetIdentifier("0x210000000");
GetIdentifier("0x10000000");
return 0;
}
Lyogc3RydG91bCBleGFtcGxlICovCiNpbmNsdWRlIDxzdGRpby5oPiAgICAgIC8qIHByaW50ZiwgTlVMTCAqLwojaW5jbHVkZSA8c3RkbGliLmg+ICAgICAvKiBzdHJ0b3VsICovCiNpbmNsdWRlIDxlcnJuby5oPgoKc2lnbmVkIGludCBHZXRJZGVudGlmaWVyKGNvbnN0IGNoYXIqIGlkU3RyaW5nKQp7CiAgY2hhciAqc3RyX2VuZDsKICBpbnQgaWQgPSAtMTsKICBlcnJubyA9IDA7CiAgaWQgPSBzdHJ0b3VsKGlkU3RyaW5nLCAmc3RyX2VuZCwgMTYpOwogIHByaW50ZigiSWQgKCVzKSAtIHN0cl9lbmQgJXMgLSBlcnJubyAlZC5cbiIsIGlkU3RyaW5nLCBzdHJfZW5kLCBlcnJubyk7CiAgaWYgKCAqc3RyX2VuZCAhPSAnXDAnIHx8IChlcnJubyA9PSBFUkFOR0UpKQogIHsKICAgIHByaW50ZigiRXJyb3Igd2hpbGUgY29udmVydGluZyBJZCAoJXMpIC0gc3RyX2VuZCAlcyAtIGVycm5vICVkLlxuIiwgaWRTdHJpbmcsIHN0cl9lbmQsIGVycm5vKTsKICAgIHJldHVybiAtMTsKICB9CgogIC8vIFJldHVybiBlcnJvciBpZiBjb252ZXJ0ZWQgSWQgaXMgbW9yZSB0aGFuIDI5LWJpdAogIGlmKGlkID4gMHgxRkZGRkZGRikKICB7CiAgICBwcmludGYoIkVycm9yOiBJZCAoJXMpIHNob3VsZCBmaXQgb24gMjkgYml0cyAobWF4aW11bSB2YWx1ZTogMHgxRkZGRkZGRikuXG4iLCBpZFN0cmluZyk7CiAgICByZXR1cm4gLTE7CiAgfQogIHByaW50Zigic3VjZXNzXG4iKTsKICByZXR1cm4gaWQ7Cn0KCgppbnQgbWFpbiAoKQp7CiAgR2V0SWRlbnRpZmllcigiaW52Iik7CiAgR2V0SWRlbnRpZmllcigiMHgyMTAwMDAwMDAiKTsKICBHZXRJZGVudGlmaWVyKCIweDEwMDAwMDAwIik7CgogIHJldHVybiAwOwp9CgoKCgo=