[FFmpeg-devel] [PATCH] Implement the function cmdutils.c:parse_int_or_die

Michael Niedermayer michaelni
Tue Feb 19 17:32:16 CET 2008


On Sun, Feb 17, 2008 at 05:08:46PM -0500, D. Hugh Redelmeier wrote:
> | From: Stefano Sabatini <stefano.sabatini-lala at poste.it>
> 
> | Attached patch proposes a solution which implements MN suggestion, for
> | what regards the double to int conversion we could simply split the
> | function int three different ones, like:
> | 
> | int parse_int_or_die(...)
> | int64_t parse_int64_or_die(...)
> | float parse_float_or_die(...)
> 
> [Sorry if I'm charging in like a bull in a china shop.  I have not
> read any ffmpeg code except for the patches I am critiquing.  I have
> not even participated in the community to learn who is who.]
> 
> This is an example where I would expect separate functions to be
> superior.  I am guessing that in most call sites, the case is known
> (i.e. the type argument is a static constant).  At a minimum I would
> use separate functions for the float and integral cases.

parse_options() for example could maybe benefit from a single function.


> 
> Matter of taste: int64_t should only be used where the problem
> dictates it.  long int or long long int are more abstract.  Of course
> there is the problem that you don't know exactly what you are getting.
> The C language really isn't very good in this area.  It is true that
> long long can hold any int64_t value but the reverse may not be the
> case.

This parses command line options and the range of valid values is not
something which should depend on LLONG_MAX. Whatever the allowed range it
should be allowed independant of LLONG_MAX.


> 
> If the function is just handling integers, then perhaps it need not
> distinguish OPT_INT and OPT_INT64.  The relevant difference will be
> captured in the min and max arguments.  Unfortunately, C does not tell
> you that int64_t can handle all values of type long. 

If max / min where set to values outside the int64_t range then the code
would fail fatally on a system where long long has just int64_t range (which
frankly are all practical systems).


> The type that we
> can be sure will hold all values of int64_t and of long would be long
> long.  Note that long long may not hold all values of uint64_t (if
> that matters).
> 
> +  fprintf(stderr, "Value for %s has be <= to %lld and <= %lld: %s\n", context, (long long int)min, (long long int)max, numstr);
> 
> The sense of min is reversed:  >= is what you want.
> The grammar needs touching up too.
> 
> I think a message like this might be clearer:
> 
> + fprintf(stderr, "The value for %s must be between %lld and %lld but you used %lld\n",
> +	context, (long long int)min, (long long int)max, lli);
> 
> (I chose to print the number we extracted rather than the string we
> were given since that may be slightly more informative.)

> 
> I'm not an expert in floating point but this concerns me:
> +        } else if (errno == ERANGE || d < -INFINITY || d > INFINITY) {
> If we are assuming that the C implementation includes the IEC 559
> support, then I think that the best test would be:
> +        } else if (errno == ERANGE || !isfinite(d)) {
> This rejects NaNs.  It also handles the afine case (I think that is
> the right term).

There is no reason why non finite values would be invalid inputs.


> 
> 
> This UNTESTED routine handles uint64_t, int, long, and long long.  But
> not floating point.  It is extracted from Sefano's code.  The double
> analogue is needed too.
> 
> long long parse_integer_or_die(const char *context, const char *numstr, long long min, long long max)
> {
>     long long int lli;
>     char *tail;
> 
>     /* errno could have been set by previous library calls, so reset it */
>     errno = 0;
>     lli = strtoll(numstr, &tail, 10);
>     if (*tail != '\0') {
> 	fprintf(stderr, "Expected integer for %s but found: %s\n", context, numstr);
> 	exit(1);
>     } else if (lli < min || lli > max) {
>         fprintf(stderr, "The value for %s must be between %lld and %lld but you used %lld\n",
> 	    context, min, max, lli);
> 	exit(1);
>     }
>     return lli;
> }

Tabs are not allowed in svn
The errno thing should disapear
the != '\0' is also useless
except that your code looks better then the last patch

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The educated differ from the uneducated as much as the living from the
dead. -- Aristotle 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080219/cfd0b693/attachment.pgp>



More information about the ffmpeg-devel mailing list