On 5/3/20 8:40 am, brainpower wrote: > Am 04.03.20 um 23:32 schrieb brainpower: >> Hi! >> >> Am 04.03.20 um 22:29 schrieb Anatol Pomozov: >>> On Wed, Mar 4, 2020 at 12:39 PM Anatol Pomozov <anatol.pomo...@gmail.com> >>> wrote: >>>> + } else if(strcmp(key, "ConcurrentDownloadStreams") == 0) { >>>> + /* TODO: what is the best way to handle int >>>> conversion errors? */ >>>> + config->concurrent_download_streams = atoi(value); >>> >>> Here is a question I have. What is the best way to handle int >>> conversion errors for this option? >>> >> >> I'd recommend strtol() [1] over atoi() any time. >> It makes it a lot easier to get error handling right, well, in most cases >> actually possible at all! >> >> I do not know of any way to differentiate between a valid "0" input and the >> error case with atoi(). >> There is no way to detect if the input was out of range, atoi() just gives >> some undefined value. >> (The only valid use case for atoi() I might find acceptable would be if you >> can be *absolutely* sure the input is a valid int. e.g. validate before >> passing to atoi) >> >> >> With strtol() do the following: >> >> 1. Call strol() >> 2. Check if *end is NULL, if it is not, parsing was aborted at the position >> *end points to > > Sorry. > I messed up and misread the documentation here. The first part of the above > is incorrect. > > You'll have to check str != end, where str is the first pointer passed to > strtol and end the second. > > >> 3. Check errno for ERANGE, it gets set if the integer given does not fit >> into a long >> 4. Now use the number. Check range again, if you want to downcast the long >> to int. >> >> [1]: https://en.cppreference.com/w/c/string/byte/strtol >>
man strtol has an example usage program, and provides instuctions on how to check for "0" from input vs error. For pacman, that would likely be considered an error anyway. A