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.pomozov@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.
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