Add missing strings.h #includes for strcasecmp().
[mplayer.git] / subopt-helper.c
index 6f4bcf6..2ee1060 100644 (file)
@@ -1,5 +1,23 @@
-/** 
- * \file subopt-helper.c
+/*
+ * This file is part of MPlayer.
+ *
+ * MPlayer is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MPlayer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with MPlayer; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/**
+ * \file
  *
  * \brief Compensates the suboption parsing code duplication a bit.
  *
@@ -22,6 +40,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <strings.h>
 #include <limits.h>
 #include <assert.h>
 
   #define NDEBUG
 #endif
 
-/* prototypes for argument parsing */
-static char const * parse_int( char const * const str, int * const valp );
-static char const * parse_str( char const * const str, strarg_t * const valp );
-static char const * parse_float( char const * const str, float * const valp );
+
+static char const * parse_int( char const * const str, int * const valp )
+{
+  char * endp;
+
+  assert( str && "parse_int(): str == NULL" );
+
+  *valp = (int)strtol( str, &endp, 0 );
+
+  /* nothing was converted */
+  if ( str == endp ) { return NULL; }
+
+  return endp;
+}
+
+static char const * parse_float( char const * const str, float * const valp )
+{
+  char * endp;
+
+  assert( str && "parse_float(): str == NULL" );
+
+  *valp = strtod( str, &endp );
+
+  /* nothing was converted */
+  if ( str == endp ) { return NULL; }
+
+  return endp;
+}
+
+#define QUOTE_CHAR '%'
+static char const * parse_str( char const * str, strarg_t * const valp )
+{
+  char const * match = strchr( str, ':' );
+
+  if (str[0] == QUOTE_CHAR) {
+    int len = 0;
+    str = &str[1];
+    len = (int)strtol(str, (char **)&str, 0);
+    if (!str || str[0] != QUOTE_CHAR || (len > strlen(str) - 1))
+      return NULL;
+    str = &str[1];
+    match = &str[len];
+  }
+  else
+  if (str[0] == '"') {
+    str = &str[1];
+    match = strchr(str, '"');
+    if (!match)
+      return NULL;
+    valp->len = match - str;
+    valp->str = str;
+    return &match[1];
+  }
+  if ( !match )
+    match = &str[strlen(str)];
+
+  // empty string or too long
+  if ((match == str) || (match - str > INT_MAX))
+    return NULL;
+
+  valp->len = match - str;
+  valp->str = str;
+
+  return match;
+}
+
 
 /**
  * \brief Try to parse all options in str and fail if it was not possible.
@@ -69,7 +150,7 @@ int subopt_parse( char const * const str, const opt_t * opts )
         {
           char * delim, * arg_delim;
 
-          /* search nearest delimiter ( option or argument delimiter ) */ 
+          /* search nearest delimiter ( option or argument delimiter ) */
           delim = strchr( &str[parse_pos], ':' );
           arg_delim = strchr( &str[parse_pos], '=' );
 
@@ -78,7 +159,7 @@ int subopt_parse( char const * const str, const opt_t * opts )
           {
             delim = strchr( &str[parse_pos], '=' );
           }
-          
+
           substr_len = delim ? // is a delim present
                          delim - &str[parse_pos] : // yes
                          strlen( &str[parse_pos] ); // no, end of string
@@ -146,8 +227,7 @@ int subopt_parse( char const * const str, const opt_t * opts )
                   tmp.str = NULL;
                   tmp.len = 0;
                   last = parse_str( &str[parse_pos], &tmp );
-                  if (*valp)
-                    free(*valp);
+                  free(*valp);
                   *valp = NULL;
                   if (tmp.str && tmp.len > 0) {
                     *valp = malloc(tmp.len + 1);
@@ -204,7 +284,7 @@ else if ( substr_len == opt_len+2 )
         /* break out of the loop, if this subopt is processed */
         if ( next ) { break; }
       }
-      
+
       /* if we had a valid suboption the current pos should *
        * equal the delimiter char, which should be ':' for  *
        * suboptions.                                        */
@@ -231,87 +311,20 @@ else if ( substr_len == opt_len+2 )
   return 0;
 }
 
-static char const * parse_int( char const * const str, int * const valp )
-{
-  char * endp;
-
-  assert( str && "parse_int(): str == NULL" );
-
-  *valp = (int)strtol( str, &endp, 0 );
-
-  /* nothing was converted */
-  if ( str == endp ) { return NULL; }
-
-  return endp;
-}
-
-static char const * parse_float( char const * const str, float * const valp )
-{
-  char * endp;
-
-  assert( str && "parse_float(): str == NULL" );
-
-  *valp = strtod( str, &endp );
-
-  /* nothing was converted */
-  if ( str == endp ) { return NULL; }
-
-  return endp;
-}
-
-#define QUOTE_CHAR '%'
-static char const * parse_str( char const * str, strarg_t * const valp )
-{
-  char const * match = strchr( str, ':' );
-
-  if (str[0] == QUOTE_CHAR) {
-    int len = 0;
-    str = &str[1];
-    len = (int)strtol(str, (char **)&str, 0);
-    if (!str || str[0] != QUOTE_CHAR || (len > strlen(str) - 1))
-      return NULL;
-    str = &str[1];
-    match = &str[len];
-  }
-  else
-  if (str[0] == '"') {
-    str = &str[1];
-    match = strchr(str, '"');
-    if (!match)
-      return NULL;
-    valp->len = match - str;
-    valp->str = str;
-    return &match[1];
-  }
-  if ( !match )
-    match = &str[strlen(str)];
-
-  // empty string or too long
-  if ((match == str) || (match - str > INT_MAX))
-    return NULL;
-
-  valp->len = match - str;
-  valp->str = str;
-
-  return match;
-}
-
 
 /*** common test functions ***/
 
 /** \brief Test if i is not negative */
-int int_non_neg( int * i )
+int int_non_neg(void *iptr)
 {
-  if ( *i < 0 ) { return 0; }
-
-  return 1;
+  int *i = iptr;
+  return *i >= 0;
 }
 /** \brief Test if i is positive. */
-int int_pos( int * i )
+int int_pos(void *iptr)
 {
-  if ( *i > 0 ) { return 1; }
-
-  return 0;
+  int *i = iptr;
+  return *i > 0;
 }
 
 /*** little helpers */
@@ -331,4 +344,3 @@ int strargcasecmp(strarg_t *arg, char *str) {
     res = arg->len - strlen(str);
   return res;
 }
-